我有一个泛型类(GenericClass
),它具有依赖性,具体取决于泛型类型(IGenericDependency
)。这种依赖也是通用的。
public class GenericClass<T>
{
private readonly IGenericDependency;
}
直到运行时才知道type参数。
到目前为止,我已经这样做了:
我正在注射一个Func。
public class GenericClass<T> : IGenericClass<T> where T:class , new()
{
private readonly IGenericDependency _genericDependency;
public GenericClass(Func<TypeIGenericDependency>> factory)
{
_genericDependency = factory(T);
}
}
注册码:
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");
};
});
我想知道是否有另一种方法可以做到这一点。
答案 0 :(得分:3)
如果您使用的是最新版本,则可以使用make IGenericDependency
generic,例如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