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的构造函数更改并简化所有控制器的构造函数时,我都不必更改所有控制器的构造函数.
您可以将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.)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |