.NET Core依赖注入在构造函数之外进行注入

12

我需要在构造函数外部注入,在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
    }
}

1
我该怎么做?如何在构造函数之外注入服务? - Tornike Choladze
1
我知道依赖注入的工作原理以及如何注册服务,但它只能在构造函数中进行注入... 我需要在构造函数之外进行注入。 - Tornike Choladze
1
不是中间件,而是关于注入。我需要在控制器中注入服务,且不使用构造函数。 - Tornike Choladze
1
实际上,您可以通过控制器操作方法参数进行注入。只需在其前面添加[FromServices]即可。 - juunas
1
谢谢,Juunas。实际上我需要一个变量形式的类似方法。我正在编写基础控制器,并且想要注入默认服务而不必在构造函数中声明它们。 - Tornike Choladze
显示剩余10条评论
1个回答

6
你可以将服务注入到操作方法中作为参数。这可以通过在参数上使用属性 [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中进行,并且只在需要时才能使用(懒加载)。有关更多信息,请参见此帖子

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


谢谢,我需要“2.手动解决服务” IServiceProvider 用于解决服务。 - Tornike Choladze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接