Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否在运行时从UnityContainer中删除已注册的类型?_C#_Unity Container - Fatal编程技术网

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

C# 是否在运行时从UnityContainer中删除已注册的类型?,c#,unity-container,C#,Unity Container,我想知道是否有一种简单的方法可以从unity容器中删除已经注册的类型,或者至少用另一个接口/类型映射替换现有的接口/类型映射。 仅仅将另一个类类型映射到一个接口并覆盖旧的类类型就足够了吗 这种情况不应该经常发生。实际上几乎没有时间,但有些情况下,我希望在不干扰其他部分的情况下,用另一个接口替换实现某些接口的服务。我还没有签出Unity,所以我可能错了,但我想你不可能这么做,正如我在我们的框架中对自己的DI功能所做的工作一样,首先发现类型,然后让应用程序运行会更加高效,因为这样你就不必每次访问都

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



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

我还没有签出Unity,所以我可能错了,但我想你不可能这么做,正如我在我们的框架中对自己的DI功能所做的工作一样,首先发现类型,然后让应用程序运行会更加高效,因为这样你就不必每次访问都锁定类型存储来查看要注入实例的实例,因为存储是只读的,它永远不会发生变化

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

收听网络广播(请参阅msdn网络广播搜索unity)它将替换wins中最后一个场景中的注册类型。因此,如果您使用config加载容器,则使用代码注册同一类型的代码,即one赢得的代码(顺便说一句,反之亦然)。

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

例如,如果您有:


public interface IService
{
    void DoSomething();
}

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

public class AnotherService : IService
{
    public void DoSomething();
}
您将某项服务注册为:


container.RegisterType<IService, SomeService>();

container.RegisterType();
然后,如果系统的另一部分希望覆盖iSeries注册以解析另一个服务,则需要将其注册为:


container.RegisterType();

这似乎很简单,但当工厂需要创建另一个服务时,我挂断了电话:


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

container.RegisterType(新注入工厂(x=>
{
//这将是一个复杂的过程
返回新的其他服务();
}));
在这种情况下,你仍然会得到一些服务。要获得预期的其他服务,您需要指定TTo类型:


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

container.RegisterType(新注入工厂(x=>
{
返回新的其他服务();
}));

如果您试图将以前的
.RegisterType
替换为返回可能有多种类型的
iSeries设备的工厂,该怎么办?我发现,
.RegisterType(new InjectionFactory(…)
没有取代以前的注册。成功
.RegisterType(新注入工厂(…)
有效。谢谢@Jacob,这是非常重要的一点。我想知道为什么RegisterType在本例中与RegisterType做的事情不完全相同。。古怪的

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