Dependency injection ASP.NET 5依赖项注入-[FromServices]属性是否仅在控制器中工作?
使用asp.net 5 beta-8,我注册了类似这样的服务: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
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();
}
}