IRepository против IRepository

#.net #generics #repository

#.net #обобщения #репозиторий

Вопрос:

Я пытаюсь определить один конкретный интерфейс для всех реализаций моих репозиториев, чем просто это:

 public abstract class GeneralizedRepository
{
    readonly IDataModel _Model;

    public GeneralizedRepository(IDataModel Model) {
        if (Model == null)
            throw new NullReferenceException();
        _Model = Model;
    }

    public IDataModel DataModel { get { return _Model; } }

    public abstract IEnumerable<T> GetAll<T>();
    public abstract T GetOne<T>(Func<T, bool> predicate);

    public abstract bool Contains<T>(Func<T, bool> predicate);
    public abstract void Add<T>(T entity);
    public abstract void Update<T>(T entity);
    public abstract bool Remove<T>(Func<T, bool> predicate);
}
  

Это класс, потому что мои производные репозитории имеют общую модель данных экземпляра

Теперь у меня есть конкретные реализации в виде:

 public class DetailRep : GeneralizedRepository
{
    public DetailRep(IDataModel Model) : base(Model) { }
    public DetailRep(UnitOfWork Unit) : base(Unit.Model) { }

    public override IEnumerable<T> GetAll<T>() {
        throw new NotImplementedException();
    }

    public override T GetOne<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }

    public override bool Contains<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }

    public override void Add<T>(T entity) {
        throw new NotImplementedException();
    }

    public override void Update<T>(T entity) {
        throw new NotImplementedException();
    }

    public override bool Remove<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }
}
  

Но это хранилище подробностей, я имею в виду, что я хочу заменить все T для типа Detail

Но во время компиляции выдается ошибка:

Объявление параметра типа должно быть идентификатором, а не типом

Комментарии:

1. Типы, указанные в названии вопроса, вообще не отображаются в вопросе!? Не могли бы вы еще раз проверить свой вопрос? И предоставьте более подробную информацию об ошибке. Например, строка, которая выдает ошибку? Вызовы base (…) неверны, но прежде чем объяснять, мне сначала нужно понять, чего вы действительно хотите.

Ответ №1:

Объявите свой абстрактный класс как универсальный:

 public abstract class GeneralizedRepository<T>
{
    readonly IDataModel _model;
    public GeneralizedRepository(IDataModel model)
    {
        if (model == null)
            throw new NullReferenceException();
        _model = model;
    }
    public IDataModel DataModel { get { return _model; } }
    public abstract IEnumerable<T> GetAll();
    public abstract T GetOne(Func<T, bool> predicate);
    public abstract bool Contains(Func<T, bool> predicate);
    public abstract void Add(T entity);
    public abstract void Update(T entity);
    public abstract bool Remove(Func<T, bool> predicate);
}
  

А затем в вашем производном классе заполните тип своим Detail :

 public class DetailRep  : GeneralizedRepository<Detail>
{
    public DetailRep(IDataModel model)
        : base(model)
    {
    }
    public override IEnumerable<Detail> GetAll(){}
    public override Detail GetOne(Func<Detail, bool> predicate){}
    public override bool Contains(Func<Detail, bool> predicate){}
    public override void Add(Detail entity){}
    public override void Update(Detail entity){}
    public override bool Remove(Func<Detail, bool> predicate){}
}
  

Комментарии:

1. но таким образом, если у меня есть 10 репозиториев, и каждый из них реализует GeneralizedRepository<T> , где T — тип содержимого, содержащегося в репозитории, компилятор сгенерирует GeneralizedRepository<Type1> , GeneralizedRepository<Type2> , …. Обобщенный репозиторий<Type10>. Мне нужен только один абстрактный класс и 10 производных классов.