我需要注入构造函数,我在Setup中声明的所有内容。
我可以这样做吗?如何从构造函数中注入服务? 类似于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)
{
}
}
感谢回答@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
}
}
答案 0 :(得分:3)
您可以将服务作为参数注入action方法。这是通过使用属性[FromServices]
标记参数来完成的。
这看起来像这样:
public IActionResult About([FromServices] IDateProvider dateProvider)
{
ViewData["Message"] = $"Current date is {dateProvider.CurrentDate}";
return View();
}
如果您正在BaseController中寻找默认服务:您可以采取以下几种方式:
<强> 1。仍然使用构造函数
这看起来像这样:
public class HomeController : BaseController
{
public HomeController(IDateProvider dateProvider) : base(dateProvider)
{
}
}
和
public class BaseController
{
protected IDateProvider _dateProvider;
protected BaseController(IDateProvider dateProvider)
{
_dateProvider = dateProvider;
}
}
这样,IDateProvider既可用于BaseController,也可用于所有继承控制器。
<强> 2。手动解决服务
这样您可以手动解决该服务。这可以在BaseController中,并且只在你需要它们时(懒惰)。有关详细信息,请参阅this post。
为了简单和可读性,我可能会选择构造函数。