多层应用程序的依赖注入
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 并且实现细节不应该泄露给消费者(这将再次违反依赖倒置原则)。
我目前正在努力理解如何在我的控制器之外使用依赖注入模式 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 并且实现细节不应该泄露给消费者(这将再次违反依赖倒置原则)。