4

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


这不应该经常发生。实际上几乎没有时间,但在某些情况下,我想用另一个实现某个接口的服务替换另一个服务,而不会干扰其他部分。

4

4 回答 4

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 注册来解析另一个服务,您需要将其注册为:


container.RegisterType<IService, 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();
}));
于 2011-03-25T19:53:04.667 回答
5

收听网络广播(参见 msdn webcasts search for unity)它会在最后一个 win 场景中替换已注册的类型。因此,如果您使用 config 加载容器,则使用代码注册相同类型的代码(顺便说一句,反之亦然)。

于 2009-01-08T00:31:12.093 回答
0

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

于 2008-12-15T14:22:03.160 回答
0

您总是可以重新创建容器并注册新类型。如果您需要一遍又一遍地这样做,这样做的成本很可能相当高,我认为您可能需要重新考虑您的框架设计。

于 2008-12-15T15:01:53.597 回答