【发布时间】:2013-05-19 07:06:50
【问题描述】:
我有一个带逆变类型参数的接口,比如IFoo:
interface IFoo<in T> {}
现在我有三个班级:
class B {}
class D : B {}
class Foo : IFoo<B> {}
如果我这样注册他们
container.RegisterType<IFoo<B>, Foo>();
...然后尝试解析IFoo<D>,它失败了,因为我没有真正注册IFoo<D>或IFoo<>
.天气晴朗。
我当前的解决方案只是遍历Registrations,找到RegisteredType 可从解析类型(在我的情况下为IFoo<D>)分配的注册,然后解析其MappedToType 类型。
问题很简单:有没有更好的方法来做到这一点?任何建议将不胜感激。
谢谢。
编辑:
更多上下文。
我有某种映射器。
IMapper<in TSource, in TDest> : IMapper // IMapper is non-generic
{
void Map(TSource source, TDest dest);
}
我只想注册基本映射器(其中TSource 是IEnumerable<T>),并且能够为实现IEnumerable<T> 的每种类型解析此映射器,例如T[]:
object source = GetSource(); // runtime type is T[]
object dest = GetDest();
Type mapperType = typeof(IMapper<,>).MakeGenericType(source.GetType(), dest.GetType());
IMapper mapper = (IMapper) container.Resolve(mapperType);
mapper.Map(source, dest);
是的,我只对基于 Unity/C# 的方法感兴趣...
【问题讨论】:
-
也许更好的方法是实现一个注册 BuilderStrategy 的 Unity 扩展。
-
切换到不同的框架?
-
你为什么要尝试解析 IFoo
而不注册它?注册或解析是否是动态的? -
@WiktorZychla:你只想注册 IFoo 以一次注册所有类型的子类。将来您可能会有其他子类,并且您希望它能够开箱即用。它还保存了要注册的课程数量。
-
@WiktorZychla:在某些情况下这是有道理的(尽管很少见)。但是使用
IEventHandler<TEvent>或在使用版本化消息进行消息传递以实现向后兼容性时,会想到处理业务事件。
标签: c# .net generics dependency-injection unity-container