J'ai une classe générique (GenericClass
) qui dépend d'un type générique (IGenericDependency
). Cette dépendance est également générique.Résolution des dépendances en fonction du type générique - Autofac
public class GenericClass<T>
{
private readonly IGenericDependency;
}
Le paramètre de type n'est pas connu avant l'exécution.
Jusqu'à présent, je l'ai fait ceci:
Je l'injection d'un Func.
public class GenericClass<T> : IGenericClass<T> where T:class , new()
{
private readonly IGenericDependency _genericDependency;
public GenericClass(Func<TypeIGenericDependency>> factory)
{
_genericDependency = factory(T);
}
}
Et le code 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");
};
});
Je me demande s'il y a une autre façon de le faire.
Wow, je savais qu'il doit y avoir une solution :-) Cela permet d'économiser plus propre beaucoup de code. Devrait être comme un exemple dans le wiki. – user137348