具有多层应用程序的依赖注入

时间:2015-02-23 17:56:43

标签: dependency-injection

我目前正在努力了解如何在控制器类之外使用依赖注入模式。

比如说我有以下控制器:

public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer();

    return businessLayer.DoSomethingAndLogIt();

  }

}

据我所知,在大多数情况下,不可能在控制器类之外使用构造函数注入。所以不可能直接使用ILog实现insdie“businesslayer”-class。

我能想象的一个简单的解决方案如下:

public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer(logger);

    return businessLayer.DoSomethingAndLogIt();

  }

}

因此将依赖项从控制器传递到底层层。但这是最好的方法吗?有没有更好的解决方案让我的businessLayer级访问ILog实现?

THX!

1 个答案:

答案 0 :(得分:3)

  

据我所知,在大多数情况下,不可能使用构造函数   注入控制器类之外。

这是不正确的。您应该对所有组件使用构造函数注入(应用程序中包含行为的每个类)。

依赖注入是指将依赖服务/组件注入消费组件。所以这意味着你不应该在你的控制器中新建businesslayer类;你应该使用构造函数注入它。通过更新此依赖项,您违反了Dependency Inversion Principle,这会导致高耦合。这再次使您的代码更难以测试,并且使得更改控制器变得更加困难,并且更加难以将横切关注点(例如日志记录,审计跟踪,事务管理等)应用于系统。

  

因此不可能直接使用ILog实现   insdie" businesslayer" -class。

不正确的。 ILog实现应该注入businesslayer类的构造函数。

长话短说,您的控制器应如下所示:

public class TestController : Controller {
  IBusinessLayer businessLayer;

  public TestController(IBusinessLayer bl) {
   this.businessLayer = bl;
  }

  public string TestMethod() {
    return businessLayer.DoSomethingAndLogIt();

} }

由于TestController似乎没有直接使用ILog,因此不应将其注入其构造函数中。 ILog是业务层类的实现细节,实现细节不应泄露给消费者(这将再次违反依赖性倒置原则)。