如何简化asp.net核心依赖注入

Nea*_*ams 1 dependency-injection asp.net-core

由于asp.net核心DI仅提供构造函数注入和方法注入.如果要注入很多服务.而不是在构造函数中编写很多并经常更改构造函数.我可以使用某种提供程序,以便我可以在控制器内到处获得服务吗?

代替 :

public class HomeController : BaseController
{
    public HomeController(
        IEmailService emailService,
        ISMSService smsService,
        ILogService logService,
        IProductRepository _productRepository)
        :base(emailService,smsService,logService)
    {
    }
    public IActionResult()
    {
        _emailService.SendSomething();
    }
    ...
}
public class BaseController : Controller
{
    protected readonly IEmailService _emailService;
    protected readonly ISMSService _smsService;
    protected readonly ILogService _logService;
    public BaseController(
        IEmailService emailService,
        ISMSService smsService,
        ILogService logService)
    {
        _emailService = emailService;
        _smsService = smsService;
        _logService = logService;
    }
}
Run Code Online (Sandbox Code Playgroud)

有一些提供者喜欢:

public class HomeController : BaseController
{

    public HomeController(IDIServiceProvider provider)
        :base(provider)
    {

    }
    public IActionResult()
    {
        _provider.GetScopedService<IEmailService>().SendSomething();
    }
    ...
}
public class BaseController : Controller
{
    protected readonly IDIServiceProvider _provider;
    public BaseController(IDIServiceProvider provider)
    {
         _provider = provider;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,每次BaseController的构造函数更改并简化所有控制器的构造函数时,我都不必更改所有控制器的构造函数.

Moi*_*jik 7

您可以将IServiceProvider注入您的控制器并从中获取您的依赖关系,但它不再是DI,它被称为服务定位器模式.

public class HomeController
{
    private readonly ITestService _testService;

    public HomeController(IServiceProvider serviceProvider)
    {
        _testService = serviceProvider.GetRequiredService<ITestService>();
    }
}
Run Code Online (Sandbox Code Playgroud)

推荐使用服务定位,因为:

1-首次查看时,您的控制器依赖性并不明显.

2-为此编写单元测试更难.

3-您的服务现在需要一个依赖项(IServiceProvider).

仅在需要时使用Service Locator模式,例如将依赖项注入FilterAttributes或ValidationAttributes.(您也可以在这种情况下使用ServiceFilter.)