Устранение проблем с общим репозиторием с Entity Framework и контейнером Castle Windsor

Я работаю над реализацией универсального репозитория с 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 ДОЛЖЕН в реализации.

Как решить эту проблему?


person user368776    schedule 16.06.2010    source источник


Ответы (1)


Это было давным-давно, но один из способов обхода — наложить такое же ограничение на ваш интерфейс.

public interface IRepository<T> where T : class
person GoClimbColorado    schedule 23.08.2011