Общий T GetByID <K>(K ID_) - PullRequest
       34

Общий T GetByID <K>(K ID_)

4 голосов
/ 18 декабря 2010

Я пытаюсь реализовать универсальный репозиторий с использованием инфраструктуры сущностей.

Мой репозиторий определен как:

    public class GenericRepository<T> : IRepository<T> where T : class

Я хочу добавить универсальный GetByID, где тип передаваемого идентификатора также является универсальным. Я действительно не хочу, чтобы моя бизнес-логика говорила мне, что тип, например, ....

    _repository.GetByID<int>(123);

Я хочу скрыть определение tyoe, но не могу понять, где и как это сделать.

Большинство сообщений в Stackoverflow, похоже, имеют только свои идентификаторы. Я не хочу, чтобы ваши идентификаторы не всегда были целыми числами!

Есть идеи по этому вопросу?

Ответы [ 4 ]

5 голосов
/ 18 декабря 2010

Я сделал это

interface IRepository<TEntity, TKey> {
     TEntity GetById(TKey id);
}

Тогда я наследую от этого интерфейса

class Person {
     int ID;
}
interface IPersonRepository : IRepository<Person, int> { ... }

Это делает его очень удобным для DI / IoC и модульного тестирования.

1 голос
/ 18 декабря 2010

Я определил идентификатор как object в моем IRepository. Иногда это int, иногда Guid, а иногда string.

Это неоптимально, но работает.

interface IRepository<T>
{
    T GetById(object id);
}
1 голос
/ 18 декабря 2010

Вы можете определить метод как принимающий тип:

var t = new Thing();

t.GetById<int>(44);

, где

public class Thing
{
public void GetById<T>(T id)
{
}
}
0 голосов
/ 18 декабря 2010

Вы пробовали перегрузку?:

T GetByID(int anint) {
    return GetByID<int>(anint);
}
...