Tor*_*dze 5 c# asp.net-core-mvc .net-core asp.net-core
我需要从构造函数中注入我在安装程序中声明的所有内容。
我可以吗?如何从构造函数中注入服务?类似于 Angular 2 中的 Injector 服务。
在控制器中没有构造函数的注入服务
像这样的东西
public class ControllerBase : Controller
{
protected IRepository<Test> _test;
protected IRepository<Test1> _test1;
protected IRepository<Test2> _test2;
public ControllerBase(INJECTOR injector)
{
_test = injector.inject(IRepository<Test>);
_test1 = injector.inject(IRepository<Test1>);
_test2 = injector.inject(IRepository<Test2>);
}
}
public class SomeController : ControllerBase
{
public SomeController(INJECTOR injector)
: base(injector)
{
}
}
Run Code Online (Sandbox Code Playgroud)
感谢回答@Rick van den Bosch
对于那些仍然无法获得我想要的东西的人:
public class ControllerBase : Controller
{
protected IRepository<Test> _test;
protected IRepository<Test1> _test1;
protected IRepository<Test2> _test2;
public ControllerBase(IServiceProvider injector)
{
_test = injector.GetService<IRepository<Test>>();
_test1 = injector.GetService<IRepository<Test1>>();
_test2 = injector.GetService<IRepository<Test2>>();
}
}
public class SomeController : ControllerBase
{
public SomeController(IServiceProvider injector)
: base(injector)
{
//HERE I HAVE ALL 3 REPO NOW WITHOUT EXTRA LINES
}
}
public class SomeController1 : ControllerBase
{
public SomeController1(IServiceProvider injector)
: base(injector)
{
//HERE I HAVE ALL 3 REPO NOW WITHOUT EXTRA LINES
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将服务作为参数注入到操作方法中。这是通过用 attribute 标记参数来完成的[FromServices]。
这看起来像这样:
public IActionResult About([FromServices] IDateProvider dateProvider)
{
ViewData["Message"] = $"Current date is {dateProvider.CurrentDate}";
return View();
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找 BaseController 中的默认服务:您可以采用以下几种方法:
1. 仍然使用构造函数
这看起来像这样:
public class HomeController : BaseController
{
public HomeController(IDateProvider dateProvider) : base(dateProvider)
{
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class BaseController
{
protected IDateProvider _dateProvider;
protected BaseController(IDateProvider dateProvider)
{
_dateProvider = dateProvider;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,IDateProvider 可用于 BaseController 和所有继承的 Controller。
2. 手动解决服务 通过
这种方式,您可以手动解决服务。这可以在 BaseController 中,并且仅在您需要它们时(懒惰)。有关更多信息,请参阅这篇文章。
为了简单性和可读性,我可能会选择构造函数。
| 归档时间: |
|
| 查看次数: |
12929 次 |
| 最近记录: |