2014-11-21 44 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); 
    } 
} 

...但我收到一個錯誤,「部分聲明不能指定不同的基類。」

所以我的問題是,我可以在哪裏放置重寫的插入方法?我是否必須製作一個繼承了通用存儲庫的獨立存儲庫?如果我這樣做了,我將如何改變我的工作班級?

謝謝你的任何建議。

+0

爲什麼你們還在試圖發現一個車輪。實體框架上下文已經實現了這兩種模式。你還需要什麼?這個額外抽象的目的是什麼? – Andrei 2014-11-21 22:13:11

+0

只有一個存儲庫模式,與語言或框架無關,因爲它是一個原則(與某個實現無關)。只要您的業務層使用存儲庫獲取/保存業務對象,它就是存儲庫模式。代碼實現是針對每個應用程序的。 – MikeSW 2014-11-22 00:37:32

+0

@AndreiMikhalevich雖然EF實現UoW,但它可能或可能不會實現存儲庫模式,具體取決於EF對域對象「按原樣」使用。作爲個人觀點,EF永遠不應該被視爲一個存儲庫,因爲它公開查詢破壞存儲庫目的的細節,並且它只能用於rdbms。 EF是關於抽象sql/tables,Repository是關於抽象**所有持久性** – MikeSW 2014-11-22 00:41:52

回答

0

我想我在一段時間後更好地理解這一點,所以想通了,我會關閉它。我不需要「重寫」任何東西,我只需要在工作單元類(duh)中添加額外的工作,然後調用插入。感謝發人深省的迴應。

相關問題