Dependency injection ASP.NET 5依赖项注入-[FromServices]属性是否仅在控制器中工作?

Dependency injection ASP.NET 5依赖项注入-[FromServices]属性是否仅在控制器中工作?,dependency-injection,asp.net-core,asp.net-core-mvc,Dependency Injection,Asp.net Core,Asp.net Core Mvc,使用asp.net 5 beta-8,我注册了类似这样的服务: services.AddTransient<IMyClass, MyClass>(); 但是,当我尝试在不继承Controller的类中使用它时,它似乎没有将myClass属性设置为IMyClass的实例: public class MyService { [FromServices] public IMyClass myClass { get; set; } public void DoSo

使用asp.net 5 beta-8,我注册了类似这样的服务:

services.AddTransient<IMyClass, MyClass>();
但是,当我尝试在不继承
Controller
的类中使用它时,它似乎没有将
myClass
属性设置为
IMyClass
的实例:

public class MyService
{
    [FromServices]
    public IMyClass myClass { get; set; }

    public void DoSomething(){
      //myClass is null
    }
}

这是预期的行为吗?如何在常规类中注入依赖项?

您可以对较低级别的类使用构造函数注入

public class MyService
{
    private readonly IMyClass _myClass;

    public MyService(IMyClass myClass)
    {
        if (myClass == null)
            throw new ArgumentNullException("myClass");
        _myClass = myClass;
    }

    public void DoSomething()
    {
        // Do something
    }
}

问题是,当您调用
newmyservice()
时,ASP.NET 5依赖项注入系统被完全绕过

为了将依赖项注入到
MyService
,我们需要让ASP.NET为我们创建实例

如果您想在控制器中使用
MyService
,您可以先将其与
IMyClass
一起注册到服务集合中

public class HomeController : Controller
{
    [FromServices]
    public IMyClass myClass { get; set; }

    public IActionResult Index()
    {
        //myClass is good
        return View();
    }
}
services.AddTransient<IMyClass, MyClass>();
services.AddTransient<MyService>();
现在,您可以自由地将此服务注入控制器:

public class HomeController : Controller
{
    [FromServices]
    public MyService myService { get; set; }

    public IActionResult Index()
    {
        // myService is not null, and it will have a IMyClass injected properly for you
        return View();
    }
}

如果您想了解更多关于ASP.NET 5依赖项注入系统的信息,我在这里发布了一个视频和博客帖子:

如何在不传入IMyClass的情况下实例化MyService类?DI容器将满足构造函数参数。控制器被实例化,其服务通过[FromServices]属性实例化,然后通过构造函数注入实例化下面所有其他依赖项。您计划在哪里实例化MyService?例如,在我想要使用MyService的控制器中,我应该创建一个IMyService并将其注入吗?是的,并且只有来自控制器的IMyService。如果控制器不需要直接调用IMyClass,那么它就不需要引用它。
[FromServices]
不再在属性上受支持。
[FromServices]
在属性上已被弃用,在构造函数中不再需要。要将
MyService
注入
HomeController
中,现在需要一个构造函数:
public HomeController(MyService-MyService)
OP询问[FromServices]是否适用于非从Controller派生的类型。这演示了如何在从控制器派生的类型上使用[FromServices]。所以我看不出这是如何回答这个问题的。
public class HomeController : Controller
{
    [FromServices]
    public MyService myService { get; set; }

    public IActionResult Index()
    {
        // myService is not null, and it will have a IMyClass injected properly for you
        return View();
    }
}