1

我正在创建一个 ASP .Net 网站,并想为我的数据层使用 Linq to SQL 类,然后有另一个项目可以为数据层提供服务。我对 Linq to SQL 相当陌生。

我拥有的结构是一个接口,它在单独的接口中列出了数据库中每个表所需的所有 CRUD(创建、读取、更新和删除)操作。

然后我有另一个实现接口的类,如果我编写所有代码来获取、更新、删除数据等,即

Public Function GetCustomers As Iqueryable(of Customer)
Dim Service as New StoreDataContext
Return From c in Service.Customers select c
End Function

我注意到我总是在我的所有方法中编写 Dim Service As New StoreDataContext 以便对我的数据做任何事情。

这让我开始思考并在每个类中创建一个属性,该属性使用数据上下文初始化该属性。为了更好地迈出一步,我想创建一个 MustInherit 类,这样所有类都将继承这个类,并且需要进行的任何更改都可以在一个阶段完成,而不是进入所有类

Public MustInherit Class MyService

    Public ReadOnly Property CurrentDataContext As StoreDataContext
        Get
            Return New StoreDataContext
        End Get
    End Property

End Class

我的客户类看起来像

Public Class CustomerSer
Inherits MyService
Implements ICustomer

Public Function GetCustomers As Iqueryable(of Customer)
Return From c in CurrentDataContext.Customers select c
End Function

正如您所知道的,上面的函数正在使用从创建的类继承的 CurrentDataContext。

问题:

  1. 这样可以吗,还是这个设计会有一些缺陷?
  2. 我需要在任何阶段或课堂上关闭此服务吗?

谢谢

4

1 回答 1

1

您应该每次都创建一个新的数据上下文,因为您想确定何时提交更改发生。这遵循称为Unit Of Work的软件工程模式,您可以在其中打开一个上下文,对实体树进行大量工作,然后点击提交。以一种方法完成所有操作,以便将来的任何人都可以清楚地了解正在发生的事情。

如果将 create 移到属性中,则提交更改会在何处生效并不清楚。您可以让一种方法打开它,另一种方法进行一些更改,然后第三种方法进行提交更改,然后另一种方法进行一些未提交的更改,这将很难检测到。

我知道这看起来像样板文件,不是 DRY(不要重复自己),但仍然是很好的编程实践。

这是Scott Guthrie关于使用 Submit Changes 的更详细的一个很好的解释。

于 2013-07-19T11:03:39.740 回答