多层应用程序的依赖注入

Dependency injection with multiple-layered application

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

举例来说,我有以下控制器:

public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer();

    return businessLayer.DoSomethingAndLogIt();

  }

}

我知道在大多数情况下,在控制器之外使用构造函数注入是不可能的-classes。所以不可能直接使用 ILog 实现独立于 "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-class 访问 ILog-implementation?

谢谢!

I understand that in most cases it is not possible to use constructor injection outside of the controller-classes.

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

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

So it would not be possible to directly use the ILog-implementation insdie the "businesslayer"-class.

不正确。 ILog 实现应该注入到 businesslayer class.

的构造函数中

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

public class TestController : Controller {
  IBusinessLayer businessLayer;

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

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

} }

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