.Net Core 依赖注入从构造函数中注入

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)

ric*_*sch 6

您可以将服务作为参数注入到操作方法中。这是通过用 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 中,并且仅在您需要它们时(懒惰)。有关更多信息,请参阅这篇文章

为了简单性和可读性,我可能会选择构造函数。