ASP.NET 5 依赖注入 - [FromServices] 属性是否仅在控制器中有效?
ASP.NET 5 Dependency Injection - Does the [FromServices] attribute only work in a controller?
使用 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
的 class 中使用它时,它似乎没有将 myClass
属性 设置为IMyClass
:
的实例
public class MyService
{
[FromServices]
public IMyClass myClass { get; set; }
public void DoSomething(){
//myClass is null
}
}
这是预期的行为吗?如何在常规 class 中注入我的依赖项?
您可以对较低级别使用构造函数注入类...
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
}
}
问题是当您调用 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 依赖注入系统的信息,我在此处制作了视频和博客 post:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/
使用 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
的 class 中使用它时,它似乎没有将 myClass
属性 设置为IMyClass
:
public class MyService
{
[FromServices]
public IMyClass myClass { get; set; }
public void DoSomething(){
//myClass is null
}
}
这是预期的行为吗?如何在常规 class 中注入我的依赖项?
您可以对较低级别使用构造函数注入类...
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
}
}
问题是当您调用 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 依赖注入系统的信息,我在此处制作了视频和博客 post:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/