【问题标题】:LINQ to SQL with Repository Pattern具有存储库模式的 LINQ to SQL
【发布时间】:2011-04-29 18:47:06
【问题描述】:

目前我正在尝试在我的项目中实现 LINQ to SQL。我正在尝试将 LINQ to SQL 与著名的存储库模式一起使用。这是我想要做的:

  1. 创建表,例如客户表。
  2. 为我的客户表生成 LINQ to SQL (.dbml)。
  3. 它生成了包含所有属性和一些部分方法的部分 Customer 类。

之后我需要为 ex 设置一些自定义方法:GetCustomerById(int id)、GetCustomerByName(string name) 等。所以我创建了一个 Customer 的部分类并实现了我需要的所有功能。

嗯,从这一步我意识到我没有实现存储库模式有点奇怪..T_T

我试图做的是创建一个访问存储库层的业务层,然后存储库层使用 LINQ to SQL 作为数据模型和对 SQL Server 的数据访问。 这是最佳做法吗?以及如何将存储库模式添加到由 LINQ to SQL 生成的我的客户部分类中?

谢谢。

【问题讨论】:

    标签: linq-to-sql design-patterns


    【解决方案1】:

    存储库模式有许多变体。它的一个简单定义是封装/隐藏其他组件的持久性逻辑的模块。

    所以你可以有一个名为 LinqToSqlRepository.cs 的类,其方法如下:

    public class LinqToSqlRepository
    {
       private YourDataContext _ctx;
    
       public LinqToSqlRepository()
       {
          _ctx = new YourDataContext();
       }
    
       public Person GetPersonById(int id)
       {
          return _ctx.Persons.SingleOrDefault(p => p.Id == id);
       }
    }
    

    然后从您的业务层调用它,如下所示:

    var db = new LinqToSqlRepository();
    var person = db.GetPersonById(int id);
    

    理想情况下,您不想将存储库添加到部分类中。它应该是分开的。你的 Repository 类应该工作你的部分类。

    说实话,(IMO)这种设计模式比 Linq2Sql 更适合 EntityFramework,因为它在 POCO 方面提供了更多的多功能性。

    Linq2Sql 无法将业务实体与持久层完全解耦。在上面的示例中,您正在返回一个 Person 对象,它实际上是 L2S 设计器中的实体,因此 UI 将需要对此的引用,从而打破了“持久性无知”的观点。

    但是正如我所说,单独创建你的存储库,不要将方法放在部分类中,在你的存储库中使用它们。

    HTH。

    【讨论】:

    • 非常好的回复 RPM1984,我真的明白你的解释。谢谢(你的)信息。是的,在我尝试学习 linq-to-sql 之前,我已经学习了 EF,并且从 EF 中我得到了我想在 linq-to-sql 中实现的存储库模式的想法。非常感谢
    • 不用担心@VinkyH,很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2010-10-25
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多