目前,我正在努力理解如何在控制器类之外使用依赖项注入模式。
例如,假设我有以下控制器:
public class TestController : Controller {
ILog logger;
public TestController(ILog log) {
logger = log;
}
public string TestMethod() {
businessLayer businessLayer = new businessLayer();
return businessLayer.DoSomethingAndLogIt();
}
}我理解,在大多数情况下,不可能在控制器类之外使用构造函数注入。因此,不可能直接使用implementation的“业务层”-class。
我能想象到的一个简单的解决方案是:
public class TestController : Controller {
ILog logger;
public TestController(ILog log) {
logger = log;
}
public string TestMethod() {
businessLayer businessLayer = new businessLayer(logger);
return businessLayer.DoSomethingAndLogIt();
}
}因此,将依赖项从控制器传递到底层。但这是最好的方法吗?是否有更好的解决方案让我的商业层类访问ILog-实现?
谢谢!
发布于 2015-02-23 22:38:54
我理解,在大多数情况下,不可能在控制器类之外使用构造函数注入。
这是错误的。您应该对所有组件(应用程序中包含行为的每个类)使用构造函数注入。
依赖注入是将依赖的服务/组件注入到消费组件中。因此,这意味着您不应该在您的控件中新建businesslayer类;您应该使用构造函数注入它。通过增加这个依赖项,您违反了依赖反演原理,这会导致高度耦合。这再次使您的代码更难测试,也使得更改控制器变得更加困难,并且使得将横切关注点(如日志记录、审计跟踪、事务管理等)应用于系统变得更加困难。
因此,不可能直接使用implementation的“业务层”-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是业务层类的实现细节,实现细节不应该泄露给使用者(这将再次违反依赖反转原则)。
https://stackoverflow.com/questions/28680195
复制相似问题