C # Respository интерфейс с методом выбора по идентификатору с использованием обобщений? - PullRequest
0 голосов
/ 12 марта 2011

Я пытаюсь найти общий способ получить объект по его идентификатору в моем хранилище.В моей базе данных, как правило, все идентификаторы являются первичными ключами и имеют тип integer.В будущем может быть случай, когда это не так, но я все еще хочу сохранить один и тот же метод для всех объектов.Вот как теперь выглядит мой интерфейс:

public interface IRepository<TE>
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }

Я видел некоторый код, где отражение используется для получения идентификатора объекта, а затем анализирует все объекты для этого специального объекта (не идеальный).Я также видел что-то вроде этого:

TE GetById(Expression<Func<TE, bool>> predicate);

Я получил эту идею от здесь .

Я еще не очень знаком с выражениями и не уверен, будет ли этоработать на меня или нет.Думаю, так и было, потому что я мог бы включить это выражение:

var foo = GetById(f => f.Id == 1);

Но я полагаю, что это на самом деле не GetById, а скорее я мог бы использовать любое выражение, чтобы получить то, что я хочу, верно?

Любые мысли будут оценены.

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

У меня обычно просто есть:

public interface IRepository<T>
{
    ...
    T Load(object id);
}

Я бы предпочел стандартизировать использование одного и того же типа (int) для всех первичных ключей, но если это невозможно, я бы использовал object и избежать дополнительной сложности второго универсального параметра.

2 голосов
/ 12 марта 2011

Во-первых, почему Repository<TE,TC> вместо Repository<T>?

Я использую два метода:

 TE GetById(int id){`
     return _querySource.Single(x=>x.Id ==1);
 }

 IQueryable<TE> Query(Expression<Func<TE,bool>> predicate){
    return _querySource.Where(predicate);
 }

(я предполагаю, что у вас есть базовый IQueryable<TE> поле и я назвал его _querySource для этого примера.)

0 голосов
/ 12 марта 2011

, поскольку TE - универсальный класс, вы не можете этого сделать.

Вы должны ограничить этот родовой TE, чтобы реализовать интерфейс со свойством [Id]

interface MainInterface
{
    Int ID{get;}
}

and in Reporsitory  :
public interface IRepository<TE, TC>  : where TE is MainInterface
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }
...