希望我能解释一下,有人可能会理解它足以帮助:)
无论如何,我想从注射类型获取属性并在另一次注射中使用它。因此,假设您在控制器上具有MVC模型状态,您希望将其注入控制器使用的服务中。
public class MyController
{
public MyController(IService service)
{
....
}
}
public class MyService : IService
{
public MyService(IModelStateWrapper modelState)
{
....
}
}
我怎样才能基本完成这个:
public class MyController
{
public MyController(IService service)
{
service.ModelState = new ModelStateWrapper(ModelState);
}
}
使用注射Autofac或任何DI容器。
答案 0 :(得分:1)
你可以做到这一点,但你必须在可能的情况下解决一些设计问题。
首先,您的IService
实现似乎要求您在构造期间传递IModelStateWrapper
,以便稍后在创建控制器期间覆盖。你必须这样做,IService
实现只将它作为属性,而不是构造函数要求。
其次,你必须确保在构造控制器之后发生service.ModelState
设置是可以的。如果有其他构造函数逻辑假定已设置service.ModelState
,那么您将无法通过DI完成某些操作。
如果你这样解开,Autofac会让你做一些非常酷的东西。注册控制器类型时,请注册lambda而不仅仅是类型。
var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>();
builder.Register(
c=>
{
var service = c.Resolve<IMyService>();
var controller = new MyController(service);
service.ModelState = new ModelStateWrapper(controller.ModelState);
return controller;
}).As<IController>();
var container = builder.Build();
注意循环逻辑事物是在注册的lambda中处理的。现在当你解决一个控制器......
var controller = container.Resolve<IController>();
......逻辑将运行,你将获得你正在寻找的效果。
同样,我会对这里发生的循环参考资料表达一些担忧。如果有办法消除控制器和服务之间的循环依赖关系,那么你就可以让DI更适合你。