C# - 业务层事务的使用(SQLServer 2005+,Oracle) - 很好的例子

标签 c# transactions business-logic transactionscope

我要使用 3 层架构构建一个服务,我真的很担心如何以事务处理的方式处理操作。

我知道我有 2 个选项:IDbTransactionTransactionScope...但我并没有真正决定去哪一个,尽管我做了很多研究。

我会选择 TransactionScope,但我不想涉及 DTC...而且我需要对 SQLServer2005 和 Oracle 的支持。 (我知道我一次只需要打开一个连接)

我希望看到它们在这两种情况下的良好使用示例/模式...良好的链接就可以了。

有点像 BL 类和 DAL 类的样子……还有事务/连接是如何在它们之间创建和传输的。

编辑1: 我正在寻找对此的某种实现(但对于这两个选项):

using(var scope = new TransactionScope())
{
    // transactional methods
    datalayer.InsertFoo();
    datalayer.InsertBar();
    scope.Complete();
}

编辑2: 由于 Denis 为我提供了一个非常好的替代方案......我仍在等待有人向我展示一个使用“TransactionScope”在业务层和数据层之间进行交互的模型的好例子

谢谢。

最佳答案

我目前在这种情况下使用的是多个存储库和多个 UnitOfWork 方法。假设您有 CustomerRepository 和 InvoiceRepository。如果您需要这样做:

customerRepository.Add(customer);
invoiceRepository.Add(bill);

并将这两个作为一个事务,然后我所做的是在创建存储库时我给它们相同的 UnitOfWork,例如:

IUnitOfWork uow = UnitOfWork.Start();
ICustomerRepository customerRepository = new CustomerRepository(uow);
IInvoiceRepository invoiceRepository = new InvoiceRepository(uow);

所以上面的陈述现在是:

customerRepository.Add(customer);
invoiceRepository.Add(bill);
uow.Commit();

所有魔法都在下面,取决于您使用什么作为数据技术(ORM,如 NHibernate,或者可能是原始的 ADO.NET - 在大多数情况下不推荐这样做)。

关于存储库模式和 UnitOfWorks 的一个很好的例子,请浏览 this tutorial ,但请注意,您不能在其中激活多个 UnitOfWorks(实际上很少有应用程序需要它,因此没有真正的问题)。 此外,本教程使用 NHibernate,因此如果您不熟悉 ORM 概念,我建议您开始学习(如果您的时间表允许的话)。

还有一件事:你在这里还有更高级的模式,比如每次对话的 session 等等,但这是高级的东西,如果你想看看 uNhAddIns 项目(也适用于 NHibernate)

关于C# - 业务层事务的使用(SQLServer 2005+,Oracle) - 很好的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308951/

相关文章:

具有两个休眠事务的 spring junit 测试

java - 业务逻辑(那是什么?)真正存在于何处以及如何使用 Spring 做到这一点?

oop - 存储库、服务或域对象 - 逻辑属于哪里?

c# - 不使用 Azure 客户端 SDK 连接到 IoT 中心

c# - 如何在 ActionFilterAttribute 的 OnActionExecuting 中区分 C# 中的两个 rest 调用

c# - 如何仅在 TransactionScope 提交时运行自定义 C# 函数?

sql-server - SQL Server 中的事务大小限制

c# - 业务验证逻辑代码异味

javascript - 在c#中检索html td onClick事件值

c# - WPF 数据虚拟化和 DataGrid