Unity:在运行时将注册类型替换为另一种类型

35

我们有一个场景,用户可以在运行时选择不同的硬件。在后台,我们有几个实现了IHardware接口的不同硬件类。我们希望使用Unity为目前选择的硬件实例注册此接口。但是,当用户选择另一种硬件时,这将要求我们在运行时替换此注册。

以下示例可能会使这更清晰:

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());

有没有什么办法可以实现这种行为?

顺便说一下:我完全意识到已经从容器中解析出来的实例不会被新实例替换。当然,我们会通过强制重新解析实例来处理它们。

1个回答

51
UnityContainer的RegisterInstance方法,如果不通过名称来区分它们,它将始终覆盖最后一个注册项。
因此,如果您调用
container.RegisterInstance<IHardware>(new HardwareB());

你将覆盖接口IHardware的注册信息,并在下一次解析尝试时检索HardwareB。


可以“尝试”注册某些内容,而不会覆盖现有的注册吗? - Dai
@Dai 如果你的意思是类似于TryRegister功能,我建议你查看调用bool IsRegistered<Type>(),它可以让你查看是否已经注册了该类型或接口。 - Nick Polyderopoulos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接