我正在尝试将名为 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 或者跟踪实例的话?
提前感谢您的帮助。
答案 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>