0

希望我能解释这一点,有人可能会理解它以提供帮助:)

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

4

1 回答 1

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 为您工作会更好。

于 2012-09-17T15:26:35.530 回答