依赖注入会导致大量开销吗?
我认为可能会,特别是如果解析器被多次调用(从模式示例来看这很有可能)?或者我的想法是错误的吗?不幸的是,我无法自己测试,因为我从未使用过它,但计划使用它。
依赖注入会导致大量开销吗?
我认为可能会,特别是如果解析器被多次调用(从模式示例来看这很有可能)?或者我的想法是错误的吗?不幸的是,我无法自己测试,因为我从未使用过它,但计划使用它。
除非您使用服务定位器,否则我怀疑开销会产生显着差异。(即使您使用它,也不太可能显着影响性能。)
使用构造函数注入和现代框架,解析器将在对象构造时被调用。大多数情况下,我认为具有依赖项的对象是相对高级别的组件、长寿命或两者兼备。
如果您正在使用IoC容器并在紧密循环中创建许多具有依赖关系的对象,则可能需要进行一些优化。您始终可以对其进行性能分析或基准测试。
简而言之,我不会担心这个问题。
依赖注入作为一个概念并不需要高开销:它只是将一个类结构化,以便它与其他类的连接可以在运行时构建,而不是在代码中硬编码。
当然,有一些构建运行时连接的方式可能会有很高的开销。请避免使用这些方式。
点击此处进行性能测试。每个测试都运行了1000000次创建操作。
请注意,该基准测试显示了单例解析和瞬态解析:单例是您注册类实例的地方,例如(使用Unity):
container.RegisterInstance<IMyType>(new ConcreteMyType());
container.RegisterType<IMyType, ConcreteMyType>();
相比返回单例,这需要更多的时间。
就整体优化而言,依赖注入的开销微不足道;其他性能瓶颈更有可能是需要优化的地方。
依赖注入本身只是一个简单的间接方法,因此会有一些开销,但确实非常小。运行时模式匹配和解析是另一回事(虽然经常与依赖注入一起使用,但并不是像DI 要求这样的额外内容;-)。
依赖注入不会带来巨大的开销。我相信你会在其他地方找到瓶颈。如果你非常担心开销,也许C#不是你想使用的语言。你使用C#是为了它带来的好处,它抽象了一些你不想处理的细节。
同样,DI也有好处,比如使你的应用程序松散耦合,这意味着将来更容易维护。
过多的开销与可测试性和可维护性代码的比较...我选择可测试和可维护的代码(你总是可以购买更快的计算机)
=)