3

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?

Répondre

0

C'était il y a longtemps, mais un travail consiste à mettre la même contrainte sur votre interface.

public interface IRepository<T> where T : class