简体   繁体   English

如何在 ASP.NET 样板中获取当前事务?

[英]How to get current transaction in ASP.NET Boilerplate?

I have a project that written ASP.NET Boilerplate (assembly version=4.0.2.0).我有一个编写 ASP.NET Boilerplate 的项目(程序集版本 = 4.0.2.0)。

I want get current transcation object in Application layer.我想在应用层获得当前的交易 object。 How can I achieve this?我怎样才能做到这一点?

You get current unit of work with using IUnitOfWorkManager .您可以使用IUnitOfWorkManager获得当前的工作单元。

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

If your class inherits something like AbpController , BackgroundJob , AbpServiceBase etc..., you can also use CurrentUnitOfWork .如果您的 class 继承了AbpControllerBackgroundJobAbpServiceBase等内容,您也可以使用CurrentUnitOfWork

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

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

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


Edit: I guess it is not possible to get it in application layer directly since it need dbcontext parameter.编辑:我想不可能直接在应用层得到它,因为它需要 dbcontext 参数。 What about creating a domain service which provides ActiveDbTransaction.如何创建一个提供 ActiveDbTransaction 的域服务。 You can create an interface for that in *.Core project and define it where you can access to dbcontext您可以在*.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);
}

Implement it someplace you can access to dbcontext在可以访问 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 https://aspnetboilerplate.com/Pages/Documents/Articles/Using-Stored-Procedures,-User-Defined-Functions-and-Views/index.html#DocHelperMethods

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM