我开始使用服务并将业务逻辑抽象给他们。一切顺利,能够以有意义的方式重用代码真是太棒了。
我所遇到的问题将在下面的一些示例代码中进行说明。正如您所看到的,人员服务处理人员的创建,并在此过程中承诺创建人员。这一切都很好,但是当我想在其他地方重用该函数时,不应该提交更改直到该父函数结束,那么我就会遇到问题。
我已在以下服务中演示了上述名为' 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
答案 0 :(得分:0)
有一条简单的规则:
你创造它,你拥有它。
也就是说,创建对象的类是确保正确处理的对象。
在您的情况下,您将所有权转移到PersonService
。在我看来这是错误的,因为PersonService
无法知道调用类打算做什么。
如果主叫班想要创建一个人然后再订购,该怎么办?如果每个服务提交,业务事务可能最终处于不一致状态。
因此,调用complexService和personService的代码负责在完成所有工作后提交UnitOfWork。通过履行责任,您也不会遇到所描述的问题。
更新以回应评论
我所说的是,它是当前执行的入口点,应该负责提交事务/ uow。它只是知道业务交易何时完成的地方。
对于MVC应用程序,入口点是MVC控制器操作。对于WCF,它是服务中的方法。对于Windows服务应用程序,它可能是计时器或线程方法。
只有那些知道是否需要调用一个,两个或三个不同的服务和/或服务方法才能完成所请求的功能的地方。