根据泛型类型解决依赖关系 - Autofac
问题描述:
我有一个泛型类(GenericClass
),它具有依赖性,具体取决于泛型类型(IGenericDependency
)。这种依赖也是通用的。根据泛型类型解决依赖关系 - Autofac
public class GenericClass<T>
{
private readonly IGenericDependency;
}
直到运行时才知道类型参数。
到目前为止,我已经做到了这一点:
我注射Func键。
public class GenericClass<T> : IGenericClass<T> where T:class , new()
{
private readonly IGenericDependency _genericDependency;
public GenericClass(Func<TypeIGenericDependency>> factory)
{
_genericDependency = factory(T);
}
}
而且reistration代码:
builder.RegisterGeneric(typeof (GenericClass<>)).As(typeof (IGenericClass<>));
builder.Register<Func<Type, IGetDataCollection>>(c =>
{
var context = c.Resolve<IComponentContext>();
return type =>
{
if(type.Name.EndsWith("Entity"))
{
return (IGenericDependency)
context.Resolve(typeof (GetEntityCollection<>)
.MakeGenericType(type));
}
if(type.Name.EndsWith("TypedList"))
{
return (IGenericDependency)
context.Resolve(typeof (GetTypedList<>)
.MakeGenericType(type));
}
throw new NotSupportedException("Not supported type");
};
});
我不知道是否有另一种方式来做到这一点。
答
如果您使用的是最近的版本,您可以使用通用的例如。 IGenericDependency<T>
然后使用通用类型的约束的实现之间进行区分:
public class GetTypedList<T> : IGenericDependency<T>
where T : TypedList {
}
public class GetEntity<T> : IGenericDependency<T>
where T : Entity {
}
GenericClass<T>
然后直接取决于IGenericDependency<T>
。
只要TypedList
和Entity
是互斥类型,Autofac将选择正确的实现。
HTH
哇,我知道一定是有整洁的解决方案:-)这节省了大量的代码。应该作为维基的一个例子。 – user137348 2010-10-06 09:13:34