我目前正在努力了解如何在控制器类之外使用依赖注入模式。
比如说我有以下控制器:
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!
答案 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
是业务层类的实现细节,实现细节不应泄露给消费者(这将再次违反依赖性倒置原则)。