我正在尝试向控制器内部使用的类注入依赖项,
我有过
//Startup.cs
public void ConfigureServices(IServiceCollection services){
services.AddMvc();//IDocumentService is a WCF service from our legacy stack
services.AddScoped(typeof(IDocumentService),typeof(DocumentServiceClient));
}
//Controller.cs
[Route("api/eci/test/[action]")]
public class Controller{
private IDocumentService injectedDocService;
public Controller(IDocumentService client){
injectedDocService=client;
}
[HttpPost({"id"})]
public void ingestedDocs(string id){
new Logic(injectedDocService).ingest(id);
}
}
//Logic.cs
public class Logic{
private IDocumentService injectedDocServiceActualTarget;
public Logic(IDocumentService injected2){
injectedDocServiceActualTarget=injected2;
}
public void injest(string id){
injectedDocServiceActualTarget.doWork(id);
}
}将其注入到目标类的父类中似乎有点多余。这是做事情的正确方式吗?
发布于 2017-08-04 22:20:09
您需要注册Logic,然后将其注入控制器。然后将DocumentService注入到Logic中。
依赖注入背后的思想是实现IoC (控制反转)原则。在您的示例中,它只是部分的,因为您在控制器中显式实例化了Logic。如果你想正确地做依赖倒置--你所有的依赖都需要作为构造函数参数传递。
发布于 2017-08-05 10:00:34
您应该抽象接口背后的Logic,只公开要由依赖项使用的成员。
public interface ILogic {
void injest(string id);
}从抽象中派生逻辑类。
//Logic.cs
public class Logic : ILogic {
private readonly IDocumentService injectedDocServiceActualTarget;
public Logic(IDocumentService injected2) {
this.injectedDocServiceActualTarget=injected2;
}
public void injest(string id) {
injectedDocServiceActualTarget.doWork(id);
}
}控制器现在应该只显式地依赖于ILogic接口
//Controller.cs
[Route("api/eci/test/[action]")]
public class Controller {
private readonly ILogic service;
public Controller(ILogic service) {
this.service = service;
}
[HttpPost({"id"})]
public void ingestedDocs(string id) {
service.ingest(id);
}
}这样,最后要做的就是向服务集合注册所有依赖项。
//Startup.cs
public void ConfigureServices(IServiceCollection services){
services.AddMvc();
services.AddScoped<IDocumentService, DocumentServiceClient>();
services.AddScoped<ILogic, Logic>();
}因此,现在当调用控制器时,所有依赖项都将被解析并注入到它们各自的依赖项中。
https://stackoverflow.com/questions/45508804
复制相似问题