首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asp.net核心依赖项传递依赖项

asp.net核心依赖项传递依赖项
EN

Stack Overflow用户
提问于 2017-08-04 22:00:50
回答 2查看 65关注 0票数 1

我正在尝试向控制器内部使用的类注入依赖项,

我有过

代码语言:javascript
复制
//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);
    }
}

将其注入到目标类的父类中似乎有点多余。这是做事情的正确方式吗?

EN

回答 2

Stack Overflow用户

发布于 2017-08-04 22:20:09

您需要注册Logic,然后将其注入控制器。然后将DocumentService注入到Logic中。

依赖注入背后的思想是实现IoC (控制反转)原则。在您的示例中,它只是部分的,因为您在控制器中显式实例化了Logic。如果你想正确地做依赖倒置--你所有的依赖都需要作为构造函数参数传递。

票数 1
EN

Stack Overflow用户

发布于 2017-08-05 10:00:34

您应该抽象接口背后的Logic,只公开要由依赖项使用的成员。

代码语言:javascript
复制
public interface ILogic {
    void injest(string id);
}

从抽象中派生逻辑类。

代码语言:javascript
复制
//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接口

代码语言:javascript
复制
//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);
    }
}

这样,最后要做的就是向服务集合注册所有依赖项。

代码语言:javascript
复制
//Startup.cs
public void ConfigureServices(IServiceCollection services){
    services.AddMvc();
    services.AddScoped<IDocumentService, DocumentServiceClient>();
    services.AddScoped<ILogic, Logic>();
}

因此,现在当调用控制器时,所有依赖项都将被解析并注入到它们各自的依赖项中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45508804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档