Решение проблемы общего хранилища с помощью Entity Framework и контейнера Castle Windsor - PullRequest
3 голосов
/ 17 июня 2010

Я работаю в общей реализации репозитория с Entity Framework v4, и хранилище должно быть разрешено Виндзорским контейнером .

Сначала интерфейс,

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 выглядит следующим образом.

<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 (если я не делаю этого, я получаю ошибку компиляции), все работает FINE, поэтому я не думаю, что это проблема с контейнером, но IObjectSet ДОЛЖЕН вреализация.

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

1 Ответ

0 голосов
/ 24 августа 2011

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

public interface IRepository<T> where T : class
...