- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不喜欢基于构造函数的依赖注入(inject)。
我相信它会增加代码复杂性并降低可维护性,我想知道是否有任何可行的替代方案。
我不是在谈论将实现与接口(interface)分离的概念,以及从接口(interface)动态解析(递归)一组对象的方法。我完全支持这一点。然而,传统的基于构造函数的方法似乎存在一些问题。
1) 所有测试都依赖于构造函数。
去年在 MVC 3 C# 项目中广泛使用 DI 后,我发现我们的代码充满了这样的内容:
public interface IMyClass {
...
}
public class MyClass : IMyClass {
public MyClass(ILogService log, IDataService data, IBlahService blah) {
_log = log;
_blah = blah;
_data = data;
}
...
}
public class MyWorker {
public MyWorker(int x, IMyClass service, ILogService logs) {
...
}
}
public class BlahHelper {
// Keep so we can create objects later
var _service = null;
public BlahHelper(IMyClass service) {
_service = service;
}
public void DoSomething() {
var worker = new SpecialPurposeWorker("flag", 100, service);
var status = worker.DoSomethingElse();
...
}
}
public MyClass() {
_log = Register.Get().Resolve<ILogService>();
_blah = Register.Get().Resolve<IBlahService>();
_data = Register.Get().Resolve<IDataService>();
}
最佳答案
在我看来,所有问题的根本原因在于没有正确执行 DI。使用构造函数 DI 的主要目的是清楚地说明某个类的所有依赖关系。如果某物依赖于某物,您总是有两种选择:使这种依赖显式化或将其隐藏在某种机制中(这种方式往往带来的麻烦多于利润)。
让我们看看你的陈述:
All tests depend on the constructors.
[snip]
Problem: If I need another service in my implementation I have to modify the constructor; and that means that all of the unit tests for this class break.
2) Service instances get passed around unnecessarily, increasing code complexity.
new
s 在业务逻辑中。对于这种情况,我更愿意注入(inject)一个 worker 工厂,从 worker 的实际创建中抽象出业务代码。
I've contemplated using the DI framework inside the constructors instead as this resolves a couple of the problems:
public MyClass() {
_log = Register.Get().Resolve<ILogService>();
_blah = Register.Get().Resolve<IBlahService>();
_data = Register.Get().Resolve<IDataService>();
}Is there any downside to doing this?
Singleton
的所有缺点。模式(不可测试的代码和应用程序的巨大状态空间)。
关于dependency-injection - 依赖注入(inject)的可行替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155469/
对于我的一个项目,我终于需要使用我的第一个多态类(std::cout 除外)。 我正在研究如何确保至少在某些情况下我有 100% 的去虚拟化调用。 这段代码是否合法可行? dynamic_cast 有
最近有一个编译问题,用这个片段说明: struct Base { }; template struct A : Base { A(){} A(Base&&) {} }; A foo()
注意:这是一个冗长的问题,需要对 MVVM“设计模式”、JSON 和 jQuery 有很好的理解.... 所以我有一个理论/主张 DHTML 中的 MVVM 是可能的 和可行的 并且想知道您是否同意/
我有一台 Mac 服务器,我正在构建 PHP 代码以允许用户上传图像、文档甚至视频文件。研究这个肯定让我很紧张,我希望上传的内容没有病毒。 自己构建一些东西会是一个巨大的挑战吗?您会这样做,还是会
根据文档,ASP.NET 项目(尚)不支持新的 PackageReference https://learn.microsoft.com/en-us/nuget/consume-packages/pa
我是一名优秀的程序员,十分优秀!