c# - IOC 容器实际上为我做了什么?

标签 c# .net inversion-of-control unity-container ioc-container

所以我已经完全重构为构造函数注入(inject),现在我有一个类似于此的 Bootstrap 类:

var container = new UnityContainer();
container.RegisterType<Type1, Impl1>();
container.RegisterType<Type2, Impl2>();
container.RegisterType<Type3, Impl3>();
container.RegisterType<Type4, Impl4>();

var type4Impl = container.Resolve((typeof)Type4) as Type4;
type4Impl.Run();

我盯着它看了一秒钟,然后才意识到 Unity 真的没有为我做任何特别的事情。省略 ctor sigs,上面可以写成:

Type1 type1Impl = Impl1();
Type2 type2Impl = Impl2();
Type3 type3Impl = Impl3(type1Impl, type2Impl);
Type4 type4Impl = Impl4(type1Impl, type3Impl);
type4Impl.Run();

构造函数注入(inject)重构很棒,真正打开了代码的可测试性。但是,我在这里怀疑 Unity 的用处。我意识到我可能以有限的方式使用框架(即不在任何地方注入(inject)容器,在代码而不是 XML 中配置,没有利用生命周期管理选项),但我没有看到它在这个例子中实际上有什么帮助.我读过不止一条评论,认为 DI 最好简单地用作一种模式,而无需容器。这是这种情况的一个很好的例子吗?该解决方案还提供了哪些我错过的其他好处?

最佳答案

我发现当容器中有许多相互依赖的类型时,DI 容器会变得有值(value)。正是在这一点上,容器的自动连接功能大放异彩。

如果您发现在从容器中取出对象时引用的是容器,那么您实际上是在遵循服务定位器模式。

关于c# - IOC 容器实际上为我做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001545/

相关文章:

c# - 将 TextBox 绑定(bind)到 ObservableCollection.Count WPF?

c# - 为什么我不能通过 Type.GetType() 找到我在 app.config 中引用的插件实例的类型?

c#-4.0 - 如何强制执行安装程序的执行顺序

.net - 如何索引 HTML 文档?

laravel - 在 Laravel 中使用 Facade 和 IoC 有什么意义

c# - 使用后处理 ObjectContext(每个请求)

c# - UWP 列表框中的文本到语音 (c#')

c# - WPF:有没有办法进行内联格式化?

c# - 使用名称单独超链接创建 Gridview

c# - 任务最小起订量等待