交易脚本和工作单元

时间:2016-04-28 19:43:58

标签: design-patterns nhibernate unit-of-work transactionscope npgsql

我们有一个C#解决方案,我们在其中应用了Transaction Script模式;它的图层如下:

  • 适配器:aplication的访问点(由MVC控制器和API控制器使用); allways只从Logic层调用一个方法;
  • 逻辑:具有业务逻辑的方法;在每个方法中,我们可以多次调用其他逻辑/存储库方法;
  • 数据访问:调用NHibernate和/或NPGSQL的方法(对于需要存储过程的昂贵操作)

现在,我们希望使用TransactionScope实现工作单元模式,每个请求使用一个且只有一个事务(即:每次调用Adapter的方法一个事务,因为我们在适配器级别使用UoW),但我们可以'弄清楚如何管理连接,因为我们可以在同一个方法中连接NHibernate和/或NPGSQL。

此致

2 个答案:

答案 0 :(得分:0)

我有点困惑......听起来你正在使用单个数据库,但是没有理由为绕过NHibernate设置单独的数据库连接。只需使用相同的。

使用多个连接需要分布式事务以确保正确性,如果可以避免,它总是更容易和更高效。

示例:

// Inside transaction...
{
    // Apologies if I didn't get the class name correct in cast.
    var conn = (NpgsqlConnection)session.Connection;
    conn.SomeDirectCall().
}

根据您的确切需求,您可能甚至不需要演员。

使用单独连接的唯一原因应该是您明确希望在同一事务中避免所有操作。

答案 1 :(得分:0)

事务脚本比工作单元更宽,下图描绘了事务脚本的体系结构,并建议工作单元位于事务脚本中。

enter image description here