首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET 5依赖注入-- [FromServices]属性仅在控制器中工作吗?

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

Stack Overflow用户
提问于 2015-11-05 02:48:34
回答 2查看 8K关注 0票数 9

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

代码语言:javascript
复制
services.AddTransient<IMyClass, MyClass>();

当我在控制器中的属性上使用这个属性时,myClass会被设置为IMyClass的实例。

代码语言:javascript
复制
public class HomeController : Controller
{
    [FromServices]
    public IMyClass myClass { get; set; }

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

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

代码语言:javascript
复制
public class MyService
{
    [FromServices]
    public IMyClass myClass { get; set; }

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-05 06:19:05

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

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

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

代码语言:javascript
复制
services.AddTransient<IMyClass, MyClass>();
services.AddTransient<MyService>();

在本例中,我选择使用构造函数注入,这样就不会犯尝试亲自实例化MyService的错误:

代码语言:javascript
复制
public class MyService
{
    public IMyClass myClass { get; set; }

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

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

现在您可以自由地将此服务注入控制器:

代码语言:javascript
复制
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/

票数 4
EN

Stack Overflow用户

发布于 2015-11-05 03:14:20

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

代码语言:javascript
复制
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
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33535824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档