2010-04-13 108 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