Dependency injection 多层应用的依赖注入

Dependency injection 多层应用的依赖注入,dependency-injection,Dependency Injection,我目前正在努力理解如何在控制器类之外使用依赖项注入模式 例如,假设我有以下控制器: public class TestController : Controller { ILog logger; public TestController(ILog log) { logger = log; } public string TestMethod() { businessLayer businessLayer = new businessLayer();

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

例如,假设我有以下控制器:

public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer();

    return businessLayer.DoSomethingAndLogIt();

  }

}
我知道在大多数情况下,不可能在控制器类之外使用构造函数注入。因此,不可能在“businesslayer”类中直接使用ILog实现

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

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实现

谢谢

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

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

依赖注入是指将依赖服务/组件注入到消费组件中。因此,这意味着您不应该在您的控制器中新建
businesslayer
类;您应该使用构造函数注入它。通过更新此依赖关系,您违反了,这会导致高度耦合。这同样使您的代码更难测试,更难更改控制器,更难将横切关注点(如日志记录、审计跟踪、事务管理等)应用于系统

因此,不可能直接使用ILog实现 进入“业务层”类

不对。应该将
ILog
实现注入到
businesslayer
类的构造函数中

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

public class TestController : Controller {
  IBusinessLayer businessLayer;

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

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

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

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

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

依赖注入是指将依赖服务/组件注入到消费组件中。因此,这意味着您不应该在您的控制器中新建
businesslayer
类;您应该使用构造函数注入它。通过更新此依赖关系,您违反了,这会导致高度耦合。这同样使您的代码更难测试,更难更改控制器,更难将横切关注点(如日志记录、审计跟踪、事务管理等)应用于系统

因此,不可能直接使用ILog实现 进入“业务层”类

不对。应该将
ILog
实现注入到
businesslayer
类的构造函数中

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

public class TestController : Controller {
  IBusinessLayer businessLayer;

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

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

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

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

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

依赖注入是指将依赖服务/组件注入到消费组件中。因此,这意味着您不应该在您的控制器中新建
businesslayer
类;您应该使用构造函数注入它。通过更新此依赖关系,您违反了,这会导致高度耦合。这同样使您的代码更难测试,更难更改控制器,更难将横切关注点(如日志记录、审计跟踪、事务管理等)应用于系统

因此,不可能直接使用ILog实现 进入“业务层”类

不对。应该将
ILog
实现注入到
businesslayer
类的构造函数中

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

public class TestController : Controller {
  IBusinessLayer businessLayer;

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

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

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

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

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

依赖注入是指将依赖服务/组件注入到消费组件中。因此,这意味着您不应该在您的控制器中新建
businesslayer
类;您应该使用构造函数注入它。通过更新此依赖关系,您违反了,这会导致高度耦合。这同样使您的代码更难测试,更难更改控制器,更难应用横切关注点(如日志记录、审计跟踪、事务管理)