如何在 ASP.NET 样板中获取当前交易?

How to get current transaction in ASP.NET Boilerplate?

我有一个项目编写了 ASP.NET 样板文件(程序集版本=4.0.2.0)。

我想在应用层获取当前交易对象。我怎样才能做到这一点?

您使用 IUnitOfWorkManager.

获取当前工作单元
IUnitOfWorkManager _unitorWorkManager;
//...
[UnitOfWork]
public void Test(){
    /*
    Your code
    */
    
    _unitOfWorkManager.Current//gives you current unit of work
        .SaveChanges();//same thing with transaction.Commit();
}

如果您的 class 继承了 AbpControllerBackgroundJobAbpServiceBase 等...,您也可以使用 CurrentUnitOfWork.

//...
[UnitOfWork]
public void Test(){
    /*
    Your code
    */

    CurrentUnitOfWork.SaveChanges();//same thing with transaction.Commit();
}

您可以查看 https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work 了解更多信息。


编辑:我想直接在应用层获取是不可能的,因为它需要dbcontext参数。如何创建一个提供 ActiveDbTransaction 的域服务。您可以在 *.Core 项目中为此创建一个接口,并在可以访问 dbcontext

的位置定义它
public interface IMyDbContextActiveTransactionProvider
{
    /// <summary>
    ///     Gets the active transaction or null if current UOW is not transactional.
    /// </summary>
    /// <param name="args"></param>
    /// <returns></returns>
    IDbTransaction GetActiveTransaction(ActiveTransactionProviderArgs args);
}

在可以访问 dbcontext 的地方实施它

public class MyDbContextActiveTransactionProvider: IMyDbContextActiveTransactionProvider, ITransientDependency {
    private readonly IActiveTransactionProvider _transactionProvider;
    public MyDbContextActiveTransactionProvider(IActiveTransactionProvider transactionProvider){
        _transactionProvider = transactionProvider;
    }

    IDbTransaction GetActiveTransaction(ActiveTransactionProviderArgs args){
        return _transactionProvider.GetActiveTransaction(new ActiveTransactionProviderArgs
        {
            {"ContextType", typeof(MyDbContext) },
            {"MultiTenancySide", MultiTenancySide }
        });
     }
}

https://aspnetboilerplate.com/Pages/Documents/Articles/Using-Stored-Procedures,-User-Defined-Functions-and-Views/index.html#DocHelperMethods