使用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的类中使用它时,它似乎没有将myClass属性设置为IMyClass的实例
public class MyService
{
[FromServices]
public IMyClass myClass { get; set; }
public void DoSomething(){
//myClass is null
}
}这是预期的行为吗?如何将依赖项注入到常规类中?
发布于 2015-11-05 06:19:05
问题是当您调用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依赖注入系统的信息,我在这里做了一个视频和博客文章:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/
发布于 2015-11-05 03:14:20
您可以为低级类使用构造函数注入..。
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
}
}https://stackoverflow.com/questions/33535824
复制相似问题