2010-05-12 46 views
1

我正在研究爲我正在創建的新ASP.NET MVC項目創建實體框架4通用存儲庫。我一直在看各種教程,他們似乎都使用工作單元模式... ...實體框架4「工作單元」模式是否適用於通用存儲庫?

從我一直在閱讀,EF使用它已經在ObjectContext中,你只是擴大這個使你自己工作單位。

來源:http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET+Zone)

一個爲什麼會去這樣做的努力? 這是使用通用存儲庫的首選方式嗎?

非常感謝, Kohan。

回答

3

這不是我使用通用存儲庫的方式。首先,我會在當前請求中的ClassARepository,CalssBRepository和其他存儲庫之間共享ObjectContext。使用IOC容器,使用注射和每個請求的行爲建議:

這是我的通用倉庫什麼樣子:

public interface IRepository<T> 
{ 
    //Retrieves list of items in table 
    IQueryable<T> List(); 
    IQueryable<T> List(params string[] includes); 
    //Creates from detached item 
    void Create(T item); 
    void Delete(int id); 
    T Get(int id); 
    T Get(int id, params string[] includes); 
    void SaveChanges(); 
} 

public class Repository<T> : IRepository<T> where T : EntityObject 
{ 
    private ObjectContext _ctx; 

    public Repository(ObjectContext ctx) 
    { 
     _ctx = ctx; 
    } 


    private static string EntitySetName 
    { 
     get 
     { 
      return String.Format(@"{0}Set", typeof(T).Name); 
     } 
    } 

    private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = _ctx.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

    #region IRepository<T> Members 

    public IQueryable<T> List() 
    { 
     return ObjectQueryList().OrderBy(@"it.ID").AsQueryable(); 
    } 

    public IQueryable<T> List(params string[] includes) 
    { 
     var list = ObjectQueryList(); 

     foreach(string include in includes) 
     { 
      list = list.Include(include); 
     } 

     return list; 
    } 

    public void Create(T item) 
    { 
     _ctx.AddObject(EntitySetName, item); 
    } 

    public void Delete(int id) 
    { 
     var item = Get(id); 
     _ctx.DeleteObject(item); 
    } 

    public T Get(int id) 
    { 
     var list = ObjectQueryList(); 
     return list.Where("ID = @0", id).First(); 
    } 

    public T Get(int id, params string[] includes) 
    { 
     var list = List(includes); 
     return list.Where("ID = @0", id).First(); 
    } 

    public void SaveChanges() 
    { 
     _ctx.SaveChanges(); 
    } 

    #endregion 

} 

ObjectContext的是通過構造函數注入。 List()方法返回IQueryable,以便在業務層(服務)對象中進一步處理。服務層返回List或IEnumerable,所以視圖中不會延遲執行。

此代碼是使用EF1創建的。 EF4版本可以有點不同,更簡單。

相關問題