.net 延迟嵌套服务中SQL的执行?

.net 延迟嵌套服务中SQL的执行?,.net,design-patterns,business-logic,.net,Design Patterns,Business Logic,我已经开始使用服务,并将我的业务逻辑抽象到它们。一切都进行得很顺利,能够以一种有意义的方式重用代码非常好 我遇到的问题在下面我编写的一些示例代码中演示。如您所见,person服务处理人员的创建,并在该过程中提交人员的创建。这一切都很好,但是当我想在其他地方重用函数,并且在父函数结束之前不应该提交更改时,我就有问题了 我已经在下面名为“ComplexService”的服务中演示了上述内容,该服务具有创建x个随机人的功能。在for循环过程中,如果由于任何原因失败,我希望不会提交对数据库的更改,但是在

我已经开始使用服务,并将我的业务逻辑抽象到它们。一切都进行得很顺利,能够以一种有意义的方式重用代码非常好

我遇到的问题在下面我编写的一些示例代码中演示。如您所见,person服务处理人员的创建,并在该过程中提交人员的创建。这一切都很好,但是当我想在其他地方重用函数,并且在父函数结束之前不应该提交更改时,我就有问题了

我已经在下面名为“ComplexService”的服务中演示了上述内容,该服务具有创建x个随机人的功能。在for循环过程中,如果由于任何原因失败,我希望不会提交对数据库的更改,但是在本例中,它会提交。我怎样才能避开这件事

服务

Public Class PersonService
    Implements IPersonService

    Private Property UnitOfWork As IUnitOfWork

    Public Sub New(unitOfWork As IUnitOfWork)
        Me.UnitOfWork = unitOfWork
    End Sub

    Public Sub Create(model As NewPersonModel) Implements IPersonService.Create
        Dim person As New Person With {
            .Name = model.Name,
            .DateOfBirth = model.DateOfBirth,
            .CreatedAt = DateTime.Now
        }
        UnitOfWork.PersonRepository.Add(person)
        UnitOfWork.Commit()
    End Sub
End Class

Public Class ComplexService
    Implements IComplexService
    Private Property PersonService As IPersonService

    Public Sub New(personService As IPersonService)
        Me.PersonService = personService
    End Sub

    Public Sub AddXRandomPeople(x As Integer) Implements IComplexService.AddXRandomPeople
        For i = 0 To x - 1
            PersonService.Create(
                New NewPersonModel With {
                    .DateOfBirth = DateTime.Now,
                    .Name = "Test"
                }
            )
        Next
    End Function
End Class
模型

Public Class NewPersonModel

    Public Property Name As String
    Public Property DateOfBirth As Date

End Class

Public Class Person

    Public Property Name As String
    Public Property DateOfBirth As Date
    Public Property CreatedAt As Date

End Class

有一个简单的规则:

你创造它,你拥有它

也就是说,创建对象的类是确保正确处理该对象的类

在您的情况下,您将所有权转移到
PersonService
。在我看来,这是错误的,因为
PersonService
不可能知道调用类打算做什么

如果调用类希望创建一个人,然后创建一个订单,该怎么办。如果每个服务都提交,业务事务可能会以不一致的状态结束

因此,调用complexService和personService的代码负责在所有工作完成后提交UnitOfWork。通过转移责任,您也不会出现所描述的问题

根据评论进行更新

我想说的是,当前执行的入口点应该负责提交事务/uow。只有那个地方知道商业交易何时完成

对于MVC应用程序,入口点是MVC控制器操作。对于WCF,它是服务中的方法。对于Windows服务应用程序,它可能是计时器或线程方法


只有那些地方知道是否需要调用一个、两个或三个不同的服务和/或服务方法来完成请求的功能。

您是说不应该在我的服务中调用UnitOfWork.Commit(),而应该将其包装到我的服务公开的函数中,以便其他服务可以调用它?我不知道我会怎么想。如果不是这样的话,你能举一个简单的例子,或者重构我的代码来解释你的观点吗?这取决于你的服务是内部服务还是web服务。您的问题没有指定。这是一个内部服务。参考您的更新答案。您认为在WCF/MVC/Windows服务层会发生什么,它会调用一个简单地包装my uow的save changes函数的函数吗?否则它怎么能决定它做了什么?我不明白这个问题?服务本身是在完成时完成的,这不取决于UoW是否提交。服务不决定工作单元何时完成,因为uoW也可以包含其他服务所做的更改。提交/保存更改只是一个合同,上面写着“很好,一切都完成了,让我们坚持更改”,这个决定必须由顶层做出。