Search code examples
c#asp.net-core.net-coreaspnetboilerplate

How to get current transaction in ASP.NET Boilerplate?


I have a project that written ASP.NET Boilerplate (assembly version=4.0.2.0).

I want get current transcation object in Application layer. How can I achieve this?


Solution

  • You get current unit of work with using 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.

    //...
    [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.


    Edit: I guess it is not possible to get it in application layer directly since it need dbcontext parameter. What about creating a domain service which provides ActiveDbTransaction. You can create an interface for that in *.Core project and define it where you can access to 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

    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