使用 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/