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

Lea*_*ner 6 c# transactions business-logic transactionscope

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

我知道我有两个选择:IDbTransaction而且TransactionScope......但我并没有真正决定去哪一个,尽管我做了很多研究.

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

我希望看到两种情况下使用它们的良好示例/模式...良好的链接可以做得很好.

类似于BL类和DAL类的样子......以及如何在它们之间创建和传递事务/连接.

Edit1: 我正在寻找一些这方面的实现(但对于这两个选项):

using(var scope = new TransactionScope())
{
    // transactional methods
    datalayer.InsertFoo();
    datalayer.InsertBar();
    scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

编辑2: 由于丹尼斯为我提供了一个非常好的选择...我还在等待有人向我展示一个模型的好例子,它使用' TransactionScope' 在业务层和数据层之间进行交互

谢谢.

Den*_*dic 11

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

customerRepository.Add(customer);
invoiceRepository.Add(bill);
Run Code Online (Sandbox Code Playgroud)

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

IUnitOfWork uow = UnitOfWork.Start();
ICustomerRepository customerRepository = new CustomerRepository(uow);
IInvoiceRepository invoiceRepository = new InvoiceRepository(uow);
Run Code Online (Sandbox Code Playgroud)

所以上面的陈述现在是:

customerRepository.Add(customer);
invoiceRepository.Add(bill);
uow.Commit();
Run Code Online (Sandbox Code Playgroud)

所有的魔力都在下面,取决于你用作数据技术的东西(ORM就像NHibernate,或者可能是原始的ADO.NET--在大多数情况下不建议这样做).

有关存储库模式和UnitOfWorks的一个很好的例子,请阅读本教程,但请注意,在其中您不能激活多个UnitOfWorks(实际上很少有应用程序需要它,因此没有真正的问题).此外,本教程使用NHibernate,所以如果您不熟悉ORM概念,我建议您加入它(如果您的时间表允许).

还有一件事:你在这里也有更高级的模式,比如每次会话的会话等等,但这是高级的东西,我现在正在把头包裹起来,如果你想看看uNhAddIns项目(对于NHibernate也是如此) )

  • 嗯,这并不是很复杂,我看到你正在思考正确的方向.UnitOfWork /存储库,它也可以用于ADO.NET,只是你会花费大量时间来构建真正的结构化数据层,因为你不希望有简单的重复CRUD方法.如果您使用原始ADO.NET的"更简单"方式,那么尝试使用表数据网关/表模块模式,并将数据绑定到.NET大量支持的DataTables(不要使用VS设计器绑定,请使用手动绑定).两种模式都在PoEAA Fowler的书中描述. (2认同)