推迟嵌套服务中SQL的执行?

时间:2017-07-11 09:14:03

标签: .net design-patterns business-logic

我开始使用服务并将业务逻辑抽象给他们。一切顺利,能够以有意义的方式重用代码真是太棒了。

我所遇到的问题将在下面的一些示例代码中进行说明。正如您所看到的,人员服务处理人员的创建,并在此过程中承诺创建人员。这一切都很好,但是当我想在其他地方重用该函数时,不应该提交更改直到该父函数结束,那么我就会遇到问题。

我已在以下服务中演示了上述名为' 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

1 个答案:

答案 0 :(得分:0)

有一条简单的规则:

  

你创造它,你拥有它。

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

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

如果主叫班想要创建一个人然后再订购,该怎么办?如果每个服务提交,业务事务可能最终处于不一致状态。

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

更新以回应评论

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

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

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