dependency-injection - ASP.NET 5 依赖注入(inject) - [FromServices] 属性是否仅在 Controller 中有效?

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

使用 asp.net 5 beta-8,我将这样的东西注册为服务:

services.AddTransient<IMyClass, MyClass>();

当我在 Controller 的属性上使用此属性时,myClass设置为 IMyClass 的实例.
public class HomeController : Controller
{
    [FromServices]
    public IMyClass myClass { get; set; }

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

但是,当我尝试在不继承 Controller 的类中使用它时,它似乎没有设置 myClass IMyClass 实例的属性:
public class MyService
{
    [FromServices]
    public IMyClass myClass { get; set; }

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

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

最佳答案

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

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

如果你想使用 MyService在您的 Controller 中,您必须首先将它与 IMyClass 一起注册到服务集合中。 .

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

在这种情况下,我选择使用构造函数注入(inject),这样我就不会犯试图实例化 MyService 的错误。我:
public class MyService
{
    public IMyClass myClass { get; set; }

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

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

现在你可以自由地将这个服务注入(inject)你的 Controller :
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 依赖注入(inject)系统的信息,我在这里制作了一个视频和博客文章:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

关于dependency-injection - ASP.NET 5 依赖注入(inject) - [FromServices] 属性是否仅在 Controller 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33535824/

相关文章:

php - 为什么在 Laravel 中对 Request 对象和 request() 助手使用依赖注入(inject)?

c# - DependencyInjection 是否支持自动注册服务?

dependency-injection - nestjs 全局 pubsub 实例和依赖注入(inject)

c# - 使用 .NET Core API 上的 Azure AD 对用户进行身份验证?

exception-handling - ASP.NET 核心异常处理 View

c# - ASP NET 5 本地化在单独的程序集中使用 View 组件

java - Java 的 MEF (.NET) 模拟

asp.net-core - 在 ASP.NET Core 中存储生产 secret

Angular http.get 不工作

c# - Asp .Net Core 中的自定义模型绑定(bind)