Я новичок в шаблонах репозитория в ASP MVC 2, и я пытаюсь выяснить, как продлить операцию в моем общем классе репозитория, и у меня возникли проблемы с выяснением как это сделать или найти его в Интернете. Я хочу, чтобы общий репозиторий и единица работы работали в большинстве случаев, но вам нужно что-то легко изменить для особых случаев.asp mvc - общий репозиторий и единица работы - метод переопределения репозитория
У меня есть следующий общий интерфейс хранилища и хранилища:
public interface IRepository<TEntity> where TEntity : class
{
List<TEntity> Get();
TEntity GetByKey(object key);
void Insert(TEntity entity);
void Delete(TEntity entity);
void Save();
}
public class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
private readonly string entity_set_name;
public readonly string entity_key_name;
private ObjectContext object_context;
private ObjectSet<TEntity> object_set;
public RepositoryBase(ObjectContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
object_context = context;
object_set = object_context.CreateObjectSet<TEntity>();
entity_set_name = object_set.EntitySet.Name;
entity_key_name = object_set.EntitySet.ElementType.KeyMembers.Single().Name;
}
public virtual List<TEntity> Get()
{
return object_set.ToList();
}
public virtual TEntity GetByKey(object key)
{
var entityKey = new EntityKey(entity_set_name, entity_key_name, key);
return (TEntity)object_context.GetObjectByKey(entityKey);
}
public virtual void Insert(TEntity entity)
{
object_set.AddObject(entity);
}
public virtual void Delete(TEntity entity)
{
object_set.DeleteObject(entity);
}
public virtual void Save()
{
object_context.SaveChanges();
}
}
... и следующий блок класса работы:
public class UnitOfWork : IDisposable
{
private MyEntities context = null;
public Dictionary<Type, object> repositories = new Dictionary<Type, object>();
public UnitOfWork()
{
context = new EmployeeAccessFormEntities();
}
public IRepository<TEntity> Repository<TEntity>() where TEntity : class
{
if (repositories.Keys.Contains(typeof(TEntity)) == true)
{
return repositories[typeof(TEntity)] as IRepository<TEntity>;
}
IRepository<TEntity> r = new RepositoryBase<TEntity>(context);
repositories.Add(typeof(TEntity), r);
return r;
}
public virtual void Save()
{
context.SaveChanges();
}
#region IDisposable Members
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
У меня есть определенный тип объекта, который нуждается в дополнительной работы добавлен в метод вставки. Я хочу сделать следующее:
public partial class MyEntity : RepositoryBase<MyEntity>
{
public override void Insert(MyEntity entity)
{
// do additional work
base.Insert(entity);
}
}
... но я получаю сообщение об ошибке «Частичные объявления не должны указывать разные базовые классы».
Так что мой вопрос в том, где я могу установить этот переопределенный метод Insert? Должен ли я сделать отдельный репозиторий, который наследует общий репозиторий? Если бы я это сделал, как мне нужно было бы изменить свой класс работы?
Благодарим за любые советы.
Почему вы, ребята, все еще пытаетесь открыть колесо. Контекст Entity Framework уже реализует эти 2 шаблона. Что еще тебе нужно? Какова цель этой дополнительной абстракции? – Andrei
Существует только один шаблон репозитория, который не имеет никакого отношения к языку или структуре, поскольку это принцип (он не связан с определенной реализацией). Пока ваш бизнес-уровень работает с репозиторием, получающим/сохраняющим бизнес-объекты, это шаблон репозитория. Реализация кода специфична для каждого приложения. – MikeSW
@AndreiMikhalevich В то время как EF реализует UoW, он может или не может реализовать шаблон репозитория, в зависимости от того, используются ли объекты домена «как есть» EF. Как личное мнение, EF никогда не следует рассматривать как репозиторий, поскольку он предоставляет детали запросов, поражающих цель репозитория, и работает только с rdbms. EF - это абстрагирование sql/tables, репозиторий - это абстрагирование ** все настойчивость ** – MikeSW