2014-11-21 4 views
0

Я новичок в шаблонах репозитория в 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? Должен ли я сделать отдельный репозиторий, который наследует общий репозиторий? Если бы я это сделал, как мне нужно было бы изменить свой класс работы?

Благодарим за любые советы.

+0

Почему вы, ребята, все еще пытаетесь открыть колесо. Контекст Entity Framework уже реализует эти 2 шаблона. Что еще тебе нужно? Какова цель этой дополнительной абстракции? – Andrei

+0

Существует только один шаблон репозитория, который не имеет никакого отношения к языку или структуре, поскольку это принцип (он не связан с определенной реализацией). Пока ваш бизнес-уровень работает с репозиторием, получающим/сохраняющим бизнес-объекты, это шаблон репозитория. Реализация кода специфична для каждого приложения. – MikeSW

+0

@AndreiMikhalevich В то время как EF реализует UoW, он может или не может реализовать шаблон репозитория, в зависимости от того, используются ли объекты домена «как есть» EF. Как личное мнение, EF никогда не следует рассматривать как репозиторий, поскольку он предоставляет детали запросов, поражающих цель репозитория, и работает только с rdbms. EF - это абстрагирование sql/tables, репозиторий - это абстрагирование ** все настойчивость ** – MikeSW

ответ

0

Я думаю, что через некоторое время я понял это лучше, поэтому я решил закрыть его. Мне не нужно было «переопределять» что-либо, мне просто нужно было добавить дополнительную работу в свою единицу рабочего класса (duh), а затем вызвать вставку. Спасибо за размышления, вызывающие реакцию.

Смежные вопросы