【问题标题】:ASP.NET Core dependency injection - How to create instances?ASP.NET Core 依赖注入 - 如何创建实例?
【发布时间】:2019-12-08 07:46:45
【问题描述】:

在启动中:

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 = ?;
    }
}

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

我看到一些代码

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

但我不知道如何获取 serviceProvider 实例而不将其注入助手。

【问题讨论】:

标签: c# asp.net-core dependency-injection


【解决方案1】:

将助手添加到容器中

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("");
    }

    //...
}

【讨论】:

  • services.AddScoped&lt;Helper&gt;(sp =&gt; new Helper(sp.GetRequiredService&lt;IMyService&gt;())); 可能只是 services.AddScoped&lt;Helper&gt;();。无需手动抓取依赖。
【解决方案2】:

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

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

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

【讨论】:

  • 这不是我想要的。我更新了我的问题
  • 我认为您想解决 di 系统,这可能是一种不好的做法
猜你喜欢
  • 2018-04-05
  • 2020-10-13
  • 2018-03-23
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多