Je travaille dans une implémentation de référentiel générique avec Entity Framework v4, et le référentiel doit être résolu par un Windsor container.Problème résolvant un référentiel générique avec Entity Framework et un conteneur Castle Windsor
D'abord l'interface,
public interface IRepository<T>
{
void Add(T entity);
void Delete(T entity);
T Find(int key)
}
Ensuite, une classe concrète implémente l'interface
public class Repository<T> : IRepository<T> where T: class
{
private IObjectSet<T> _objectSet;
}
donc j'ai besoin _objectSet
de faire des choses comme ça dans la classe précédente,
public void Add(T entity)
{
_objectSet.AddObject(entity);
}
Et maintenant le problème, comme vous pouvez le voir, j'utilise une interface Entity Framework comme IObjectSet
pour effectuer le travail, mais ce type requiert une contrainte pour le type générique T "where T: class".
Cette contrainte provoque une exception lorsque Windsor tente de résoudre son type de béton. La configuration de Windsor ressemble à ceci.
<castle>
<components>
<component id="LVRepository"
service="Repository.Infraestructure.IRepository`1, Repository"
type="Repository.Infraestructure.Repository`1, Repository"
lifestyle="transient">
</component>
</components>
</castle>
Le conteneur résout code:
IRepository<Product> productsRep =_container.Resolve<IRepository<Product>>();
Maintenant, l'exception que je reçois:
System.ArgumentException: GenericArguments[0], 'T', on 'Repository.Infraestructure.Repository`1[T]' violates the constraint of type 'T'. ---> System.TypeLoadException: GenericArguments[0], 'T', on 'Repository.Infraestructure.Repository`1[T]' violates the constraint of type parameter 'T'.
Si je supprime la contrainte dans la classe concrète et la dépendance à l'égard IObjectSet (si Je ne le fais pas, j'obtiens une erreur de compilation) tout fonctionne FIN, donc je ne pense pas que c'est un problème de conteneur, mais IObjectSet
est un MUST dans l'implémentation.
Comment résoudre ce problème?