gpt4 book ai didi

asp.net-core - 如何简化asp.net core依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 16:36:37 25 4
gpt4 key购买 nike

由于asp.net core DI只提供构造函数注入(inject)和方法注入(inject)。如果有很多服务需要注入(inject)。而不是在构造函数内部编写大量内容并频繁更改构造函数。我可以使用某种提供商,以便我可以在 Controller 内的任何地方获取服务吗?

而不是:

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

使用某种提供商,例如:

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

这样我就不必在每次BaseController的构造函数发生变化时都更改所有 Controller 的构造函数,并简化了所有 Controller 的构造函数。

最佳答案

您可以将 IServiceProvider 注入(inject) Controller 并从中获取依赖项,但它不再是 DI,而是称为服务定位器模式。

public class HomeController
{
private readonly ITestService _testService;

public HomeController(IServiceProvider serviceProvider)
{
_testService = serviceProvider.GetRequiredService<ITestService>();
}
}

这是 recommended 使用服务定位器,因为:

1- 乍一看,您的 Controller 依赖性并不明显。

2-为此编写单元测试更加困难。

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

仅在需要时才使用服务定位器模式,例如将依赖项注入(inject) FilterAttributes 或 ValidationAttributes。 (对于这种情况,您也可以使用 ServiceFilter。)

关于asp.net-core - 如何简化asp.net core依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com