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
类;您应该使用构造函数注入它。通过更新此依赖关系,您违反了,这会导致高度耦合。这同样使您的代码更难测试,更难更改控制器,更难应用横切关注点(如日志记录、审计跟踪、事务管理)