2010-04-13 157 views
0

我現在的程序存儲庫是如下,請建議,我目前使用LINQ2SQL數據上下文每個刀片/ delele /更新LINQ2SQL數據層/庫建議

namespace Lib.Repository 
{ 

    public class MotorRenewalDataRepository 
    { 
     public MotorRenewalDataRepository()   
     { 

     } 
     public MotorRenewalData GetByID(long id) 
     { 
      using(var _context=DatabaseFactory.Create(false)) 
      { 
       return _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == id).FirstOrDefault(); 
      } 
     } 
     public MotorRenewalData Insert(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(false)) 
      { 
       _context.MotorRenewalDatas.InsertOnSubmit(entity); 
       _context.SubmitChanges(); 
       return entity; 
      } 
     } 
     public void Update(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(true)) 
      { 
       var dbEntity = _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == entity.MotorRenewalDataID) 
          .FirstOrDefault();     
       Common.CopyObject<MotorRenewalData>(entity, dbEntity); 
       _context.SubmitChanges(); 

      } 

     } 

    } 
} 
+0

問題是什麼? – SteadyEddi 2010-04-13 14:07:17

回答

0

如果我正確理解你的問題,你正在尋找的建議關於如何正確實施存儲庫模式。這是一個使用存儲庫模式的好習慣。首先,您需要爲您的存儲庫創建一個界面。這是您定義存儲庫可以執行的操作的地方。

public interface IRepository<T> 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Save(); 
    IQueryable<T> FindAll(); 
} 

接下來,您可以創建單個存儲庫。你想在這裏做的第一件事是創建一個接口,用於你可能正在做的一個正常的存儲庫之外的任何東西。

public interface IMotorRenewalRepository : IRepository<MotorRenewal> 
{ 
    MotorRenewal FindMotorRenewalById(int id); 
} 

而且該接口將實施MotorRenewal的IRepository讓你從IRepository一切,一切你IMotorRenewalRepository定義。當你爲你的倉庫編寫虛假的對象和單元測試時使用某種依賴注入的時候,這個接口是最常用的。

現在編寫你的MotorRenewalRepository並實現IMotorRenewalRepository。

public class MotorRenewalRepository : IMotorRenewalRepository 
{ 
    MyDataContext _dataContext = new MyDataContext(); 

    public void Add(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.InsertOnSubmit(motorRenewal); 
    } 

    public void Delete(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.DeleteOnSubmit(motorRenewal); 
    } 

    public void Save() 
    { 
     _dataContext.SubmitChanges(); 
    } 

    public IQueryable<MotorRenewal> FindAll() 
    { 
     return _dataContext.MotorRenewals.AsQueryable(); 
    } 

    public User FindMotorRenewalById(int id) 
    { 
     return _dataContext.MotorRenewals.Where(p => p.MotorRenewalDataID == id).SingleOrDefault(); 
    } 
} 

這個實現很容易理解。注意你不需要更新。更新實際上就是您將MotorRenewal對象從存儲庫中拉出,編輯並調用.Save()。

對於數據上下文,您可以使用類級別變量,而不是在每次調用存儲庫上的方法時創建新變量。 MyDataContext應該來自您在您的數據連接中拖入LinqToSql類時創建的模型。

+0

@MindlessProgrammer關於swhook關於重用DataContext的建議,請參閱Rick Strahl關於DataContext生命週期管理的文章:http://www.west-wind.com/weblog/posts/246222.aspx。我承認我們假設你正在創建一個新的'DataContext',但實際上可能會返回一個緩存實例。如果是這樣的話,我只會建議將'Create()'方法重命名爲'Get()',以使語義更加準確。 – Jay 2010-04-13 14:27:13

+0

@swhook @Jay我知道創建接口和實現,我不在乎,我只需要結構化的可用代碼。我真正想知道的是DatabaseFactory.Create(useObjectTracking)重新創建一個新的datacontext實例,我知道我可以創建一個datacontext並簡單地更新實體,然後調用提交更改,通常跟蹤對象,但是這個存儲庫Lib是共享的通過Web服務,Web應用程序,Mutlithreaded winform應用程序,我通常遇到跟蹤對象的問題,所以我沒有進行對象跟蹤,這是一種好的做法嗎? – MindlessProgrammer 2010-04-13 17:25:08