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

时间:2015-11-05 02:48:35

标签: dependency-injection asp.net-core asp.net-core-mvc

使用asp.net 5 beta-8,我将此类服务注册为服务:

services.AddTransient<IMyClass, MyClass>();

当我在控制器中的属性上使用此属性时,myClass将设置为IMyClass的实例。

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

    public IActionResult Index()
    {
        //myClass is good
        return View();
    }
}

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

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

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

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

2 个答案:

答案 0 :(得分:5)

问题是当你调用new MyService()时,完全绕过了ASP.NET 5依赖注入系统。

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

如果您想在控制器中使用MyService,则必须先将服务集合与IMyClass一起注册。

services.AddTransient<IMyClass, MyClass>();
services.AddTransient<MyService>();

在这种情况下,我选择使用构造函数注入,所以我不会错误地试图自己实例化MyService

public class MyService
{
    public IMyClass myClass { get; set; }

    public MyService(IMyClass myClass)
    {
        this.myClass = myClass;
    }

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

现在您可以将此服务注入您的控制器:

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依赖注入系统的更多信息,我在此处制作了视频和博客文章:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

答案 1 :(得分:2)

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

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