Я работаю над реализацией универсального репозитория с Entity Framework v4, и репозиторий должен разрешаться с помощью контейнера Windsor.
Сначала интерфейс,
public interface IRepository<T>
{
void Add(T entity);
void Delete(T entity);
T Find(int key)
}
Затем конкретный класс реализует интерфейс
public class Repository<T> : IRepository<T> where T: class
{
private IObjectSet<T> _objectSet;
}
Итак, мне нужно _objectSet
, чтобы делать подобные вещи в предыдущем классе,
public void Add(T entity)
{
_objectSet.AddObject(entity);
}
А теперь проблема, как вы можете видеть, я использую интерфейс Entity Framework, такой как IObjectSet
, для выполнения работы, но этот тип требует ограничения для универсального типа T "where T: class".
Это ограничение вызывает исключение, когда Windsor пытается разрешить свой конкретный тип. Конфигурация Windsor выглядит следующим образом.
<castle>
<components>
<component id="LVRepository"
service="Repository.Infraestructure.IRepository`1, Repository"
type="Repository.Infraestructure.Repository`1, Repository"
lifestyle="transient">
</component>
</components>
</castle>
Контейнер разрешает код:
IRepository<Product> productsRep =_container.Resolve<IRepository<Product>>();
Теперь исключение, которое я получаю:
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'.
Если я удалю ограничение в конкретном классе и зависимость от IObjectSet (если я этого не сделаю, я получу ошибку компиляции), все будет работать ОТЛИЧНО, поэтому я не думаю, что это проблема контейнера, но IObjectSet
ДОЛЖЕН в реализации.
Как решить эту проблему?