|
|
1
4
这真的是个人品味的问题。 就我个人而言,我喜欢在服务层设置事务边界。如果你开始考虑SOA,那么对服务的每次调用都应该是独立的。如果你的视图层必须调用2个不同的服务(我们可以说这已经是一种代码气味),那么这2个服务应该彼此独立,可以有不同的事务配置,等等。在服务之外没有打开的事务也有助于确保在服务之外没有发生任何修改。 OTOH,您将不得不更多地考虑您在服务中所做的工作(延迟加载、如果需要共同的事务性,则将功能分组到同一服务方法中等)。 一种可以帮助减少延迟加载错误的模式是在服务层之外使用Value Object。服务应始终加载所需的所有数据并将其复制到VO。你失去了持久对象和视图层之间的直接映射(这意味着你必须编写更多的代码),但你可能会发现你的清晰度有所提高。.. 编辑: 这个决定将基于权衡,所以我仍然认为这至少在一定程度上是个人品味的问题。服务层的事务对我来说更清晰(更像SOA,逻辑明显局限于服务层,不同的调用明显分开,…)。这种方法的问题是LazyLoadingExceptions,可以通过使用VO来解决。如果VO只是持久对象的副本,那么是的,它显然违反了DRY原则。如果你像使用数据库视图一样使用VO,那么VO就是持久对象的简化。这仍然需要编写更多的代码,但它会让你的设计更清晰。如果您需要插入一些授权方案,它会变得特别有用:如果某些字段仅对某些角色可见,您可以将授权置于服务级别,并且永远不会返回不应查看的数据。 |
|
|
2
2
这不是真的,事实上,很容易遇到臭名昭著的LazyInitialization Exception,只需加载一个对象,并在查看后尝试读取它的属性,具体取决于你的配置,你会得到谎言 |
|
|
Jake · 如何回滚臭鼬事务以进行集成测试?(缺少隐式原点) 10 月前 |
|
|
Riyaz Vagapov · EF核心交易 1 年前 |
|
|
M. Kemp · Oracle删除操作将永远存在 2 年前 |
|
Kuldeep · 我们什么时候应该在数据库中进行交易? 2 年前 |