.Net核心依赖注入从构造函数中注入 [英] .Net Core Dependency Injection inject out of constructor

查看:445
本文介绍了.Net核心依赖注入从构造函数中注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要从构造函数中注入所有我在安装程序中声明的内容。

I need to inject out of constructor, everything I declared in Setup.

我能做到吗?如何从构造函数中注入服务?
类似于Angular 2中的注入器服务。

Ho can I do it ? How can I inject services out of constructor ? Something like Injector service in Angular 2.

在控制器中没有构造函数的注入服务

类似的东西

    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
    }
}


推荐答案

您可以将服务作为操作方法的参数注入。这是通过使用属性 [FromServices] 标记参数来完成的。

You can inject the service as a parameter to the action method. This is done by marking the parameter with the attribute [FromServices].

这看起来像这样:

public IActionResult About([FromServices] IDateProvider dateProvider)
{
    ViewData["Message"] = $"Current date is {dateProvider.CurrentDate}";

    return View();
}

如果您正在BaseController中寻找默认服务,则可以几种方法:

If you're looking for default services in a BaseController: you could go about that several ways:

1。仍然使用构造函数

这看起来像这样:

1. Still use a constructor
This would look something like this:

public class HomeController : BaseController
{
    public HomeController(IDateProvider dateProvider) : base(dateProvider)
    {
    }
}

and

public class BaseController
{
    protected IDateProvider _dateProvider;

    protected BaseController(IDateProvider dateProvider)
    {
        _dateProvider = dateProvider;
    }
}

这样IDateProvider可用于BaseController和所有继承的控制器。

This way the IDateProvider is available to both the BaseController and all inheriting Controllers.

2。手动解决服务

这样,您可以手动解决服务。这可以在BaseController中,并且仅在需要它们时才(懒惰)。有关更多信息,请参见这篇文章

为简单起见,我可能会选择构造函数之一。

For simplicity and readability I would probably choose the constructor one.

这篇关于.Net核心依赖注入从构造函数中注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆