【问题标题】:Transaction Script and Unit of Work事务脚本和工作单元
【发布时间】:2016-04-28 19:43:58
【问题描述】:
我们有一个应用事务脚本模式的 C# 解决方案;它的层次如下:
- 适配器:应用程序的访问点(由 MVC 控制器和 API 控制器使用);总是从逻辑层调用一个方法;
- 逻辑:具有业务逻辑的方法;在每个方法中,我们可以多次调用其他逻辑/存储库方法;
- 数据访问:调用 NHibernate 和/或 NPGSQL 的方法(用于需要存储过程的昂贵操作)
现在,我们希望使用 TransactionScope 实现工作单元模式,以便每个请求使用一个且仅一个事务(即:每次从适配器调用方法一个事务,因为我们在适配器级别使用 UoW),但我们可以'不知道如何管理连接,因为我们可以在同一方法中为 NHibernate 和/或 NPGSQL 建立连接。
问候
【问题讨论】:
标签:
design-patterns
nhibernate
unit-of-work
transactionscope
npgsql
【解决方案1】:
我有点困惑...听起来您正在使用单个数据库,但是没有理由有一个单独的数据库连接来绕过 NHibernate。使用同一个即可。
使用多个连接需要分布式事务来确保正确性,如果可以避免这种情况,它总是更容易且性能更高。
例子:
// Inside transaction...
{
// Apologies if I didn't get the class name correct in cast.
var conn = (NpgsqlConnection)session.Connection;
conn.SomeDirectCall().
}
根据您的确切需求,您甚至可能不需要演员表。
使用单独连接的唯一原因应该是您明确希望避免在同一个事务中完成所有操作。
【解决方案2】:
事务脚本比工作单元宽,下图描绘了事务脚本的架构,并表明工作单元位于事务脚本内。