【问题标题】:.Net Core Dependency Injection inject out of constructor.Net Core Dependency Injection 从构造函数中注入 [关闭]
【发布时间】:2017-06-13 11:12:34
【问题描述】:

我需要从构造函数中注入我在 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
    }
}

【问题讨论】:

  • 我能做到吗?如何从构造函数中注入服务?
  • 我知道 DI 是如何工作的以及如何注册服务,但它只能在构造函数中注入......我需要注入它。
  • 不是中间件,它是关于注入的,我需要在没有控制器中的构造函数的情况下注入服务
  • 其实可以通过控制器动作方法参数注入。只需在前面添加[FromServices]即可。
  • thx juunas 实际上我需要类似的东西,但作为变量,我正在编写基本控制器,我想注入默认服务而不在构造函数中声明它们

标签: c# asp.net-core asp.net-core-mvc .net-core


【解决方案1】:

您可以将服务作为参数注入到操作方法中。这是通过使用属性[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 和所有继承的 Controller 都可用。

2。手动解析服务
这样您就可以手动解析服务。这可能在 BaseController 中,并且仅在您需要它们时(懒惰)。有关详细信息,请参阅this post

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

【讨论】:

  • 谢谢我需要“2. 手动解析服务” IServiceProvider 用于解析服务
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多