我们有一个场景,用户可以在运行时在不同的硬件之间进行选择。在后台,我们有几种不同的硬件类,它们都实现了IHardware接口(interface)。我们想使用Unity为该接口(interface)注册当前选择的硬件实例。但是,当用户选择其他硬件时,这将要求我们在运行时替换此注册。

下面的示例可能使这一点更清楚:

public interface IHardware
{
    // some methods...
}

public class HardwareA : IHardware
{
    // ...
}

public class HardwareB : IHardware
{
    // ...
}


container.RegisterInstance<IHardware>(new HardwareA());

// user selects new hardware somewhere in the configuration...

// the following is invalid code, but can it be achieved another way?
container.ReplaceInstance<IHardware>(new HardwareB());

可以以某种方式实现此行为吗?

顺便说一句:我完全知道,已经从容器中解析出来的实例当然不会被新实例替换。我们会通过强制他们再次解决实例来自己解决问题。

最佳答案

如果您不按名称区分UnityContainer的RegisterInstance方法,则它将始终覆盖最后的注册条目。

所以如果你打电话

container.RegisterInstance<IHardware>(new HardwareB());

您将覆盖接口(interface)IHardware的注册,并在下一次尝试解析时撤回HardwareB

10-08 19:42