c# - 当并非所有实例都被使用时,依赖注入是一个好主意吗?
问题描述
我是在您的应用程序上使用依赖注入的支持者,尽管有些人认为它给代码增加了不必要的复杂性。在过去的几天里,我一直在想,对于某些场景,使用 DI 时可能会有一些浪费。
让我用代码示例解释一下:
使用 DI
public class Class
{
private Service1 service1;
private Service2 service2;
public MyClass (Service1 service1, Service2 service2)
{
this.service1 = service1;
this.service2 = service2;
}
private int SampleMethod()
{
Console.WriteLine("doing something with service 1");
service1.DoSomething();
return 0;
}
private int SampleMethod2()
{
Console.WriteLine("doing something with service 2");
service2.DoSomethingElse();
return 1;
}
}
如果我很少调用 SampleMethod2 并且每次需要 Class 实例时都会注入它怎么办?那不是浪费资源吗?
几天前我收到了这个问题,我正在尝试找出答案。不使用 DI 并让每个方法在使用时创建他们需要的实例以避免这种“浪费”是否更容易?
由于 DI 提供的解耦,这是合理的“浪费”吗?
解决方案
是的,它将被“浪费”,但这种浪费的性质取决于其设置方式:
- 如果
Service2
总是作为新实例创建;这是相当昂贵的 - 如果
Service2
处于单实例模式,它所做的只是获取现有实例(超级便宜) - 如果
Class
处于单实例模式;它获取该实例而不注入任何新内容
此外,这将表明违反 SRP。也许Class
应该分成两个对象,一个依赖于Service1
,一个依赖于Service 2
(甚至两者)。
不管上述情况如何,“浪费”只有在它真正影响您的应用程序时才重要,DI 的好处远远超过这些类型的问题。
推荐阅读
- node.js - 在生产环境模式下运行 node.js
- flutter - 如何在颤动中处理 ListView 内的图像宽度?
- java - 如何配置最少读取的消息 - Spring Kafka
- ios - 如何在折线图中仅显示 24 小时列?
- python - 无法使用 pycharm 调试 Dev Appserver,但能够正常运行
- java - Jenkins Jacoco 报告 - 无法从报告中排除包
- javascript - 不同的桌面和移动视图 - 什么方法是最好的?
- javascript - 如何在 Strapi 中根据模型的关系查询模型
- javascript - 在对象中映射点符号键?
- circuit-breaker - 每个消息/api调用有2个差异/相同的断路器(resilience4j)是推荐还是好主意?