0

我正在尝试添加一个名为TypeA的类型作为两种不同的注册类型:InterfaceAInterfaceB

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

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

我也尝试将.AsSingleton()添加到通话中,但这没有任何区别。

我做错了什么,或者有没有人有任何想法这样做而不添加TypeAFactory或这样来跟踪实例?

提前感谢您的帮助。

4

2 回答 2

1

我认为您所看到的是设计使然。

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

var instanceOfA = new TypeA(...);
container.Register<InterfaceA>(instanceOfA);
container.Register<InterfaceB>(instanceOfA);
于 2014-06-05T05:30:47.280 回答
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);

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

于 2014-06-05T12:14:04.527 回答