相关方法中的依赖注入“嵌套”

时间:2011-09-06 14:35:40

标签: c# .net design-patterns dependency-injection

我们正在使用DI和Unity来处理不同的依赖项(通常是数据库和存储库类,dto到实体映射器等) 现在我们正在尝试创建更小的函数来执行尝试彼此独立的任务,以提高可测试性并避免具有许多不同职责的方法,以避免耦合

我遇到的一个问题是,当我们有依赖其他内部方法的方法时,如果嵌套不是微不足道的话,应该如何使用DI。例如,请考虑以下示例(只是一个概念,而不是真正的工作代码):

public ProcessedOrder ProcessOrders(Order inputOrder)
{
    foreach (var line in inputOrder.OrderLines)
    {
         var someData = LineProcessor(line);
    }
}

public SomeData LineProcessor(OrderLine line)
{
      /* do some stuff*/
      var OtherData = ThingProcessor(null,line.SomeStuff);
      var ret = new SomeData();
      // assign values, more stuff
      return ret;
}

public OtherData ThingProcessor(IDep1 someDependency, SomeStuff stuff)
{
      someDependency = someDependency ?? ServiceLocator.Resolve<IDep1>();
      var ret = someDependency.DoThings(stuff);
      return ret;
}

好的,到目前为止,这个例子表明我们有3个函数,理论上可以自己调用。在ThingProcessor中有一些注入的依赖项,如果它是null,那么它会尝试解析它。 然而,这是一个简单的例子,但我看到了一些我不喜欢的东西。例如,我在第一个参数中调用ThingProcessor,其值为null。所以我可以说,好吧,我修改LineProcessor的签名以使其注入,以便将其传递给需要它的其他函数。然而,他真的不需要它,它不是它的依赖,而是他所要求的功能。 所以在这里我不知道什么方法是更正确的方法,如果我正在展示的方法,或者我应该跨层传递相关的依赖关系。如果我做最后一件事,那么最外面的函数将是一个混乱,因为它将有一个很长的依赖列表,它将提供给它下面的每个人。 然而,我不太喜欢“空方法”,所以我很确定某些地方出了问题,并且可能有更好的方法来设计它。 什么是最好的方法???请记住,所有函数必须独立使用(单独调用),所以例如我可以在某个时刻调用ThingProcessor,或者只在另一个函数调用LineProcessor。

更新:

public CommonPurposeFunctions(IDep1 dep1, IDep2 dep2 ....)
{  
      this.Dep1 = dep1;
      this.Dep2 = dep2;
      [...]

}

public ProcessedOrder ProcessOrders(Order inputOrder)
{
    foreach (var line in inputOrder.OrderLines)
    {
         var someData = LineProcessor(line);
    }
}

public SomeData LineProcessor(OrderLine line)
{
      /* do some stuff*/
      var OtherData = ThingProcessor(line.SomeStuff);
      var ret = new SomeData();
      var morethings = this.Dep2.DoMoreThings();
      // assign values, more stuff
      return ret;
}

public OtherData ThingProcessor(SomeStuff stuff)
{
      var ret = this.Dep1.DoThings(stuff);
      return ret;
}

2 个答案:

答案 0 :(得分:3)

我们使用的方法是构造函数注入,然后我们将依赖项存储在私有成员字段中。容器连接依赖项;所以类和构造函数参数的数量并不重要。

这适用于服务。如果调用之间的依赖关系具有有意义的状态,则必须将它们传递给每个调用。但是,在这种情况下,我会质疑这些方法是否真的需要在自己的类中使用公共方法。

您希望最终使用一种设计来消除服务定位器并真正注入依赖项。

答案 1 :(得分:0)

null对象模式有帮助吗?

http://en.wikipedia.org/wiki/Null_Object_pattern