在运行时从UnityContainer中删除已注册的类型?

时间:2008-12-15 14:11:10

标签: c# unity-container

我想知道是否有一种简单的方法可以从统一容器中删除已注册的类型,或者至少用另一个替换现有的接口/类型映射。 只是将另一个类类型映射到接口并且旧的类型被覆盖了吗?


这不应该经常发生。实际上几乎没有任何时间,但有些情况我想要更换一个服务,实现某个接口与另一个接口,而不会让其他部分受到干扰。

4 个答案:

答案 0 :(得分:11)

使用Unity 2,如果您尝试将一个注册替换为另一个注册,则需要在新注册中指定From类型和To类型,如果它们包含在原始注册中。

例如,如果你有:


public interface IService
{
    void DoSomething();
}

public class SomeService : IService
{
    public void DoSomething();
}

public class AnotherService : IService
{
    public void DoSomething();
}

并将SomeService注册为:


container.RegisterType<IService, SomeService>();

然后,如果您的系统的另一部分想要覆盖IService注册以解析AnotherService,您需要将其注册为:


container.RegisterType<IService, AnotherService>();

这看起来非常简单,但是当一个工厂需要创建AnotherService时,我就挂了它:


container.RegisterType<IService>(new InjectionFactory(x =>
{
    // this would be some complicated procedure
    return new AnotherService();
}));

在这种情况下,您仍然会获得SomeService。要获得类似于您期望的AnotherService,您需要指定TTo类型:


container.RegisterType<IService, AnotherService>(new InjectionFactory(x =>
{
    return new AnotherService();
}));

答案 1 :(得分:5)

收听网络直播(请参阅msdn网络广播搜索统一),它将取代最后一次胜利场景中的注册类型。因此,如果您使用config来加载容器,那么使用代码来注册相同类型的代码(反之亦然顺便提一下)。

答案 2 :(得分:0)

我还没有检查过Unity,所以我可能错了,但我想你不可能做的事情,就像我在我们框架中对自己的DI功能的工作一样,事实证明它更多有效地首先发现类型,然后让应用程序运行,因为您不必为每次访问锁定类型存储,以查看要注入实例的实例,因为存储是只读的,它永远不会发生变异。

答案 3 :(得分:0)

您可以随时重新创建容器并注册新类型。如果您需要一遍又一遍地执行此操作,这很可能是相当昂贵的。我认为您可能需要重新考虑您的框架设计。