如果注册为多个注册类型,RegisterMultiple不会将实现类型保持为单例?

时间:2014-06-04 22:39:34

标签: nancy tinyioc

我正在尝试将名为 TypeA 的类型添加为两种不同的注册类型: InterfaceA InterfaceB

container.RegisterMultiple(typeof(InterfaceA), new[] {typeof(TypeA), typeof(TypeB)});
container.RegisterMultiple(typeof(InterfaceB), new[] {typeof(TypeA), typeof(TypeC)});

但是当我解决它们时,我在解析 InterfaceA 时会得到一个 TypeA 实例,而在解析 InterfaceB 时会得到另一个实例。我希望两个结果都得到相同的实例,但我不是。

我还尝试将 .AsSingleton()添加到调用中,但它没有任何区别。

我做错了什么,或者有没有想过这样做而没有添加 TypeAFactory 或者跟踪实例的话?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为你所看到的是设计。

要为两个接口获取相同的实例,您可以自己创建实例并为两个接口注册它:

var instanceOfA = new TypeA(...);
container.Register<InterfaceA>(instanceOfA);
container.Register<InterfaceB>(instanceOfA);

答案 1 :(得分:0)

我自己用一个非常丑陋(但非常优雅)的解决方案解决了这个问题。

我创建了一个 TinyIoCContainer 的另一个内部实例,并通过以下形式为其提供了一个工厂,用实际的 TinyIoCContainer.Current 注册我的所有类型:

var container = TinyIoCContainer.Current;
var internalIoC = new TinyIoCContainer();
Dictionary<Type, Object> instances = new Dictionary<Type, Object>();

...

Func<TinyIoCContainer, NamedParameterOverloads, Object> factory = (TinyIoCContainer c, NamedParameterOverloads o) =>
{
    if (instances.ContainsKey(implementationType) == false)
    {
        // Create the instance only once, and save it to our dictionary.
        // This way we can get singleton implementations of multi-registered types.
        instances.Add(implementationType, internalIoC.Resolve(implementationType));
    }

    return instances[implementationType];
};

container.Register(registerType, factory, implementationType.FullName);

我确信这个解决方案会有一些警告,但我也确定我能够为他们找到一个可行的解决方案,就像现在的情况一样。< / p>