1
14
今天早上我启动电脑时遇到了一个我正在做的项目的问题。我有一些想法,导致下面的设计-评论将是可怕的。不幸的是,josh建议的设计是不可能的,因为我必须使用远程sql服务器,并且无法启用它所依赖的分布式事务协调器服务。 我的解决方案基于对现有代码的一些简单更改。 首先,我的所有库都实现了一个简单的标记接口:
其次,我让所有支持事务的存储库实现以下接口:
这个想法是,在我的所有存储库中,我实现了这个接口并添加了代码,这些代码直接依赖于实际的提供者引入事务(对于假存储库,我已经在提交上执行了一个委托列表)。对于LINQtoSQL,很容易实现诸如:
当然,这需要为每个线程创建一个新的存储库类,但这对于我的项目来说是合理的。
使用存储库的每个方法都需要调用
欢迎评论! |
2
8
我将研究使用某种类型的事务作用域/上下文系统。因此,您可能拥有以下代码,这些代码大致基于.NET&C。
TransactionScope可以嵌套,因此假设您有一个跨越多个服务的操作,您的应用程序也将创建一个TransactionScope。现在,在当前的.NET中,如果您使用TransactionScope,它们会使您有可能降级为一个DTC,但这将在将来得到解决。 我们创建了自己的transactionscope类,该类基本上管理数据库连接并使用本地sql事务。 |
3
5
使用spring.net aop+nhibernate,您可以正常编写存储库类,并在自定义xml文件中配置事务:
在XML文件中,选择要在事务中执行的方法:
在代码中,您将获得customerservice类的一个实例,如下所示:
spring.net将返回一个customerservice类的代理,当您调用createOrder方法时,该代理将应用一个事务。这样,在服务类中就没有特定于事务的代码。AOP负责。有关更多细节,您可以查看文档。 Spring.NET 是的。 |
4
3
您希望看到工作单元模式的实现。在那里有NHiBiNATE的实现。一个是在rhino commons项目中,还有machine.uow。 |
5
3
这不是存储库的责任,通常是在更高的层次上完成的事情。尽管你说你对特定的技术不感兴趣,但我认为把这些解决方案捆绑在一起是值得的,例如,当你将nhibernate与一个你可能会考虑使用的web应用程序一起使用时 session-per request 是的。 因此,如果您可以在更高的级别管理事务,那么我的两个选择是:
如果你选择第二个选项,那么问题是内存中的对象会发生什么,你的客户可能会处于不一致的状态。如果这很重要,而且我工作的情况下,它并不是因为该对象只加载了该请求,那么我会考虑前面的检查是否可能,因为它比其他选项更容易(回滚内存中的更改或重新加载对象)。 |
6
1
可以将事务参数添加到要在事务中运行的方法的末尾,并给它提供默认值NULL。因此,如果不想在现有事务中运行该方法,则将结束参数或显式传递NULL。 在这些方法中,可以检查NULL参数以确定是否创建新事务或使用传入的事务。例如,可以将此逻辑推送到基类。 这使您的方法比使用基于上下文的解决方案更纯净,尽管后者对于通用库可能更好。不过,在一个独立的应用程序中,你知道哪些方法需要在事务中被链接起来,而不是全部。
然后你可以为你的服务层有一个事务管理器…
服务方法可能是这样的…
这很容易模拟单元测试…
|
Vedant · 如何解决python啦啦队长问题?[已关闭] 2 年前 |
cobby · 在战略模式中使用工厂模式? 2 年前 |
Nobody · Java中带while循环的三角形模式 2 年前 |
Eduard Stefanescu · 如何在层之间传输异常? 6 年前 |
D. Schreier Talha Noyon · 对于目录中的每个类 6 年前 |
Tanvi Jaywant · 如何重载类 6 年前 |