中断的IoC链

我正在构建一个使用抽象工厂模式的应用程序,以允许运行时根据它对标识请求的响应来确定我的IHardwareDevice的哪个子类。 我可能会创建Hardware1或Hardware2。

出现问题的原因是我想在这些IHardwareDevice对象中使用State模式,我想让IoC容器创建State。 有没有一种好方法可以在不直接调用IoC容器来解析用于保护IHardwareDevice的State对象的情况下执行此操作?

或者,我是以错误的方式思考这个问题的? 因为我的Factory几乎是这个库的入口点,所以可以让这个Factory句柄实例化容器以便在库中使用吗? 我计划让客户端应用程序实例化容器,然后使用它来访问所需的库部分,例如Factory。

我打算使用Windsor作为IoC容器,但是如果需要,我可以在项目的早期阶段进行切换。

Windsor拥有非常强大的自动实施抽象工厂的设施 – Typeed Factory Facility

它主要基于约定,如果默认约定不符合您的需要,您可以通过提供自定义ITypedFactoryComponentSelector来覆盖它。

它使您可以访问决策时可能需要的所有信息 – 您希望传递给调用通道的内联参数以及要解析的组件。

这是使用Autofac 2.2( http://autofac.org )完成的一种方式:

首先,用于区分状态的枚举(构成一些可能的值):

 public enum DeviceState { Online, Offline } 

然后,状态实现,如:

 public class OnlineState : IDeviceState { } 

接下来,使用相应的枚举键注册每个状态:

 var builder = new ContainerBuilder(); builder.RegisterType().Keyed(DeviceState.Online); builder.RegisterType().Keyed(DeviceState.Offline); // Register other components here 

最后,硬件设备使用索引来选择状态。 IIndex的实现由容器自动提供:

 public class Modem : IHardwareDevice { IIndex _states; IDeviceState _currentState; public Modem(IIndex states) { _states = states; SwitchOn(); } void SwitchOn() { _currentState = _states[DeviceState.Online]; } } 

希望这可以帮助。

缺口

大多数IoC容器(包括Windsor)都可以选择将显式依赖项(参数)传递给已解析依赖项的构造函数; 当你调用Resolve方法时。

所以是的,您可以将State对象显式传递给您正在解析的IHardwareDevice实例。