在注册期间从注入类型获取财产

时间:2012-09-15 02:07:02

标签: asp.net-mvc-3 dependency-injection autofac

希望我能解释一下,有人可能会理解它足以帮助:)

无论如何,我想从注射类型获取属性并在另一次注射中使用它。因此,假设您在控制器上具有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容器。

1 个答案:

答案 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更适合你。