依赖注入 - 构造函数和容器之间的某处

时间:2013-11-10 00:36:16

标签: oop dependency-injection inversion-of-control

我有一种情况,我目前正在使用构造函数依赖注入来处理适合更大Web框架的小模块。

它工作正常,但现在引入了一个新类,需要传递2个对象。但是,其中一个对象需要大量的工作才能进行设置 - 基本上它会调用大约4个方法调用,这些方法调用会创建其他对象,以使其进入工作状态,准备传递给我的对象。

我的困境是由于所涉及的工作,构造函数注入是没有用的,但引入ioc容器是过分的,特别是对于这个1关闭用例。

那么,应如何处理?是否有某种解决方案位于这两个选项的中间?

3 个答案:

答案 0 :(得分:2)

你已经有效地获得了四个五个选择:

  • 穷人的DI(手动创建对象并传递给构造函数)
  • IoC容器
  • 工厂方法
  • 抽象工厂
  • Builder (谢谢,Mark Seemann!)

我通常从一个IoC容器开始,但我做了一个很多的DI。 (我见过太多紧密耦合的代码库。)

如果你不想引入IoC容器,我会倾向于穷人的DI。

如果您使用任何面向对象的语言(而不仅仅是C#),我建议您阅读本书Dependency Injection in .NET。它详细介绍了模式和反模式。

答案 1 :(得分:1)

  

其中一个对象需要大量工作才能进行设置 - 基本上它会调用大约4个方法调用,这些方法调用会创建其他对象,以使其进入工作状态,准备传递给我的对象。

好的,然后创建对象并将完全初始化的对象传递给构造函数,在构造函数中需要它。

创建该对象听起来像是Builder或Factory的工作。

答案 2 :(得分:1)

  

我的困境是构造函数注入由于工作没有用   参与,

我更喜欢Constructor Injection并且没有理由避免它。

使用现代IoC框架,您可以通过工厂/工厂方法指定涉及“需要进行大量工作”的创建逻辑。

无论构建IMyService的实例需要多少步骤,您只需使用构造函数依赖项来注入它。

Castle Windsor

container.AddFacility<FactorySupportFacility>()
  .Register(
   Component.For<IMyFactory>().ImplementedBy<MyFactory>(),
   Component.For<IMyService>()
        .UsingFactoryMethod(k => k.Resolve<IMyFactory>().Create())
  );

Unity

var container = new UnityContainer();
container.RegisterType<IMyFactory, MyFactory>();
container.RegisterType<IMyService>(
    new InjectionFactory(c => c.Resolve<IMyFactory>().Create()));