繁体   English   中英

ASP.NET Core 依赖注入 - 如何创建实例?

[英]ASP.NET Core dependency injection - How to create instances?

在启动中:

services.AddTransient<IMyService, MyService>()

控制器方法:

[HttpGet]
public JsonResult GetSomething()
{
    Helper helper = new Helper(new MyService()); // works but looking better solution
    return Ok("");
}

辅助类:

public class Helper
{
    private readonly IMyService myService;

    public Helper(IMyService myService)
    {
        this.myService = myService;
    }

    public Helper()
    {
         this.myService = ?;
    }
}

我想在使用new MyService()手动注入依赖项的情况下实例化 Helper 类。 MyService() 类应该是启动时的类。 我还想将 Helper 类放在另一个程序集中。

我看到一些代码

var service = (IFooService)serviceProvider.GetService(typeof(IMyService));

但我不知道如何在不将其注入帮助程序的情况下获取 serviceProvider 实例。

一种通过 DI 正确解析服务的方法:

[HttpGet]
public JsonResult GetSomething([FromServices] IMyService myService)
{
    Helper helper = new Helper(myService);
    return Ok("");
}

或者你通过ctor注入它并在方法中使用它。

将助手添加到容器中

services.AddTransient<IMyService, MyService>()
services.AddScoped<Helper>(sp => new Helper(sp.GetRequiredService<IMyService>()));

并显式地将其注入控制器

public class MyController: Controller {
    private readonly Helper helper;

    public MyController(Helper helper) {
        this.helper = helper;
    }    

    [HttpGet]
    public JsonResult GetSomething() {
        //...use helper 

        return Ok("");
    }

    //...
}

理想情况下,助手也应该从抽象派生

public class Helper : IHelper {
    private readonly IMyService myService;

    public Helper(IMyService myService) {
        this.myService = myService;
    }

    //...
}

并相应地添加到容器中

services.AddTransient<IMyService, MyService>()
services.AddScoped<IHelper, Helper>();

避免控制器与凝结物紧密耦合(实施问题)

public class MyController: Controller {
    private readonly IHelper helper;

    public MyController(IHelper helper) {
        this.helper = helper;
    }    

    [HttpGet]
    public JsonResult GetSomething() {
        //...use helper 

        return Ok("");
    }

    //...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM