[Отредактировано: сущности ниже генерируются Entity-Framework]
Я пытаюсь реализовать универсальный репозиторий.Ниже приведены некоторые интерфейсы, которые определяют специализированные черты.
namespace AnimeVoter.DataLayer.Repositories
{
internal interface ICanCreate<TEntity>
{
void Create(TEntity entity);
}
internal interface ICanUpdate<TEntity>
{
bool Update(TEntity entity);
}
internal interface ICanDelete<TEntity>
{
bool Delete(TEntity entity);
}
internal interface ICanGetList<TEntity>
{
IEnumerable<TEntity> GetList();
}
internal interface ICanGetById<TEntity>
{
TEntity GetById(int id);
}
}
Теперь у меня также есть абстрактный класс, который комбинирует черты, как показано ниже.
namespace AnimeVoter.DataLayer.Repositories
{
public abstract class CrudRepository<TEntity> :
ICanCreate<TEntity>,
ICanUpdate<TEntity>,
ICanDelete<TEntity>,
ICanGetList<TEntity>,
ICanGetById<TEntity>
{
public abstract void Create(TEntity entity);
public abstract bool Update(TEntity entity);
public abstract bool Delete(TEntity entity);
public abstract IEnumerable<TEntity> GetList();
public abstract TEntity GetById(int id);
}
}
Тогда у меня есть где-то 10-15 конкретныхклассы, которые используют абстракцию выше.Я покажу только два.Я также ограничу обсуждение общим методом Create ().
Ниже приведена таблица пользователей в базе данных:
namespace AnimeVoter.DataLayer.Repositories.Impl
{
public class UserRepository : CrudRepository<User>, IDisposable
{
DbEntities db = new DbEntities();
public override void Create(User entity)
{
db.Users.AddObject(entity);
}
...
Ниже приведена таблица заголовков в базе данных:
namespace AnimeVoter.DataLayer.Repositories.Impl
{
public class TitleRepository : CrudRepository<Title>, IDisposable
{
DbEntities db = new DbEntities();
public override void Create(Title entity)
{
db.Titles.AddObject(entity);
}
...
Так вот в чем проблема!Когда я добавляю новую запись в таблицу User, я делаю db.Users.AddObject (entity) .И при добавлении в таблицу заголовков я делаю db.Titles.AddObject (entity) .
Теперь мне интересно, как я могу реорганизовать это, используя дженерики, чтобы я мог просто сделать что-то вроде db <"TableName">. AddObject (entity) или что-нибудь на этот счет, чтобы я мог иметьтолько одна реализация для всех таблиц вместо множества реализаций для каждой из них?