Я пишу Eatal4 для создания веб-приложения MVC 2, и мне нужны предложения по выбору классов наследования и абстрактных базовых классов. Мой репозиторий хорошо работал после структуры «generic repo», но теперь я хочу добавить функциональность «Аудит», которая записывает каждый раз, когда выполняется операция CRUD.Вопрос о создании репозитория C#
Это контракт я использовал до сих пор:
public interface IRepository<T>
{
void Create(T entity);
void Update(T entity);
void Delete(Func<T, bool> predicate);
T Get(Func<T, bool> predicate);
IQueryable<T> Query();
}
Мой репо. реализация выглядит следующим образом:
sealed class EFRepository<TEntity> : IRepository<TEntity>
where TEntity : EntityObject
{
ObjectContext _context;
ObjectSet<TEntity> _entitySet;
public EFRepository(ObjectContext context)
{
_context = context;
_entitySet = _context.CreateObjectSet<TEntity>();
}
public void Create(TEntity entity)
{
_entitySet.AddObject(entity);
_context.SaveChanges();
}
public void Update(TEntity entity)
{
_entitySet.UpdateObject(entity);
_context.SaveChanges();
}
public void Delete(Func<TEntity, bool> predicate)
{
TEntity entity = _entitySet.Single(predicate);
_entitySet.DeleteObject(entity);
_context.SaveChanges();
}
public TEntity Get(Func<TEntity, bool> predicate)
{
return _entitySet.SingleOrDefault(predicate);
}
public IQueryable<TEntity> Query()
{
return _entitySet;
}
}
Я хочу создать концепцию AuditableRepository<T>
. Должен ли я создать его так:
interface IAuditable<T>
interface IRepository<T>
AuditableRepository<T> : IRepository<T>, IAuditable<T>
EFRepository<T> : AuditableRepository<T>
или лучше иметь это так:
interface IAuditable<T>
interface IRepository<T>
EFRepository<T> : IRepository<T>, IAuditable<T>
или даже:
interface IAuditable<T>
interface IRepository<T>
AuditableRepository<T> : IRepository<T>, IAuditable<T>
EFRepository<T> : IRepository<T>
AuditableEFRepository<T> : AuditableRepository<T>
Не все мои EFRepositories должны быть аудит. Как мне продолжить?
действительно ли абстрактный базовый класс обеспечивает любую реализацию? –
@ Russ Cam: Нет, я вставил его как есть. Должен ли я удалить его? Я использую фабрику репозитория для создания репозиториев с Ninject, вводящих соответствующий тип базы данных (разные физические базы данных). Эти репозитории затем вводятся в мои контроллеры MVC 2. – John
Я не думаю, что абстрактный класс в текущей форме дает вам что-то дополнительное по интерфейсу. Я думаю, вы могли бы удалить абстрактный класс. –