C# 中断的国际奥委会链

C# 中断的国际奥委会链,c#,inversion-of-control,C#,Inversion Of Control,我正在构建一个应用程序,它使用抽象工厂模式,允许运行时根据IHardwareDevice响应标识请求的方式确定要创建的IHardwareDevice子类。我可能会创建硬件1或硬件2 问题在于,我希望在这些IHardwareDevice对象中使用状态模式,并且希望由IoC容器创建状态。有没有一种不直接调用IoC容器来解析IHardwareDevice所使用的状态对象的好方法 或者,我是不是想错了?因为我的工厂几乎是这个库的入口点,所以让这个工厂句柄实例化在库中使用的容器可以吗?我计划让客户机应用程

我正在构建一个应用程序,它使用抽象工厂模式,允许运行时根据IHardwareDevice响应标识请求的方式确定要创建的IHardwareDevice子类。我可能会创建硬件1或硬件2

问题在于,我希望在这些IHardwareDevice对象中使用状态模式,并且希望由IoC容器创建状态。有没有一种不直接调用IoC容器来解析IHardwareDevice所使用的状态对象的好方法

或者,我是不是想错了?因为我的工厂几乎是这个库的入口点,所以让这个工厂句柄实例化在库中使用的容器可以吗?我计划让客户机应用程序实例化容器,然后使用它访问它所需要的库的任何部分,例如工厂


我计划使用Windsor作为IoC容器,但我在项目中还处于早期阶段,可以根据需要进行切换。

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


因此,是的,您可以将您的
状态
对象显式地传递给正在解析的
iHardware设备
实例。

这里有一种方法可以使用Autofac 2.2()完成:

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

然后,状态实现,如:

public class OnlineState : IDeviceState { }
接下来,使用对应的枚举键注册每个状态:

var builder = new ContainerBuilder();
builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online);
builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState.Offline);
// Register other components here
希望这有帮助


尼克

温莎有一个非常强大的自动实现抽象工厂的设施-

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


通过它,您可以访问做出决策所需的所有信息—希望通过调用通道传递的内联参数,以及希望解析的组件。

您所说的“我希望由IoC容器创建状态”是什么意思?这意味着我希望状态对象可能必须由IoC容器满足的任何依赖项,而不是让工厂实例化它们并将它们传递给状态对象。理想情况下,我希望避免直接引用容器并从我的库中调用Resolve。我将尝试类型化工厂设施,如果这对我不起作用,我将求助于这个选项。谢谢
var builder = new ContainerBuilder();
builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online);
builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState.Offline);
// Register other components here
public class Modem : IHardwareDevice
{
    IIndex<DeviceState, IDeviceState> _states;
    IDeviceState _currentState;

    public Modem(IIndex<DeviceState, IDeviceState> states)
    {
         _states = states;
         SwitchOn();
    }

    void SwitchOn()
    {
         _currentState = _states[DeviceState.Online];
    }
}