我有一种情况,我目前正在使用构造函数依赖注入来处理适合更大Web框架的小模块。
它工作正常,但现在引入了一个新类,需要传递2个对象。但是,其中一个对象需要大量的工作才能进行设置 - 基本上它会调用大约4个方法调用,这些方法调用会创建其他对象,以使其进入工作状态,准备传递给我的对象。
我的困境是由于所涉及的工作,构造函数注入是没有用的,但引入ioc容器是过分的,特别是对于这个1关闭用例。
那么,应如何处理?是否有某种解决方案位于这两个选项的中间?
答案 0 :(得分:2)
你已经有效地获得了四个五个选择:
我通常从一个IoC容器开始,但我做了一个很多的DI。 (我见过太多紧密耦合的代码库。)
如果你不想引入IoC容器,我会倾向于穷人的DI。
如果您使用任何面向对象的语言(而不仅仅是C#),我建议您阅读本书Dependency Injection in .NET。它详细介绍了模式和反模式。
答案 1 :(得分:1)
其中一个对象需要大量工作才能进行设置 - 基本上它会调用大约4个方法调用,这些方法调用会创建其他对象,以使其进入工作状态,准备传递给我的对象。
好的,然后创建对象并将完全初始化的对象传递给构造函数,在构造函数中需要它。
创建该对象听起来像是Builder或Factory的工作。
答案 2 :(得分:1)
我的困境是构造函数注入由于工作没有用 参与,
我更喜欢Constructor Injection
并且没有理由避免它。
使用现代IoC框架,您可以通过工厂/工厂方法指定涉及“需要进行大量工作”的创建逻辑。
无论构建IMyService
的实例需要多少步骤,您只需使用构造函数依赖项来注入它。
container.AddFacility<FactorySupportFacility>()
.Register(
Component.For<IMyFactory>().ImplementedBy<MyFactory>(),
Component.For<IMyService>()
.UsingFactoryMethod(k => k.Resolve<IMyFactory>().Create())
);
var container = new UnityContainer();
container.RegisterType<IMyFactory, MyFactory>();
container.RegisterType<IMyService>(
new InjectionFactory(c => c.Resolve<IMyFactory>().Create()));