具有存储库模式的 LINQ to SQL

发布于 2024-09-28 22:58:08 字数 490 浏览 1 评论 0原文

目前我正在尝试在我的项目中实现 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 生成的客户部分类中?

谢谢。

Currently I'm trying to implement LINQ to SQL in my project. I'm trying to use LINQ to SQL with the famous repository pattern. here is what I was trying to do:

  1. Create table, for example customer table.
  2. Generate LINQ to SQL (.dbml) for my customer table.
  3. It generated partial Customer class complete with all the properties and some partial method.

After that I need to put some custom method for ex: GetCustomerById(int id), GetCustomerByName(string name), etc. So I create a partial class of Customer and implement all the function that I need.

Hmmm, from this step I realized that there is something weird that I haven't implemented the repository pattern.. T_T

What I was trying to do was create a business layer that access repository layer, and then repository layer use LINQ to SQL as data model and data access to SQL Server.
Is this the best practice? and how to add repository pattern to my customer partial class generated by LINQ to SQL?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里南柯 2024-10-05 22:58:08

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

因此,您可以有一个名为 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);

理想情况下,您不想添加您的存储库到您的部分类。它应该是分开的。您的存储库类应该解决您的部分类。

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

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

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

HTH。

There are many variations of the Repository pattern. A simple definition of it is a module that encapsulates/hides the persistence logic from other components.

So you could have a class called LinqToSqlRepository.cs, with a method like so:

public class LinqToSqlRepository
{
   private YourDataContext _ctx;

   public LinqToSqlRepository()
   {
      _ctx = new YourDataContext();
   }

   public Person GetPersonById(int id)
   {
      return _ctx.Persons.SingleOrDefault(p => p.Id == id);
   }
}

And call it from your Business Layer like so:

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

Ideally you don't want to add your repository to your partial class. It should be seperate. Your Repository class should work off your partial classes.

To be honest though, (IMO) this kind of design pattern is better suited for EntityFramework than Linq2Sql, as it offers much more versatility in terms of POCO's.

There is no way with Linq2Sql to completely de-couple the business entities from the persistence layer. In the above example, you are returning a Person object, which is actually the entity in the L2S designer, therefore the UI will need a reference to this, defeating the point of 'persistence-ignorance'.

However as i said, create your Repository seperate, don't put the methods in the partial class, work with them in your Repository.

HTH.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文