![](/img/trans.png)
[英]Dependency injection of multiple instances of same type in ASP.NET Core 2
[英]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.