Как получить текущую транзакцию в ASP. NET Boilerplate? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть проект, в котором написано ASP. NET Boilerplate (версия сборки = 4.0.2.0).

Я хочу получить текущий объект трансляции на уровне приложения. Как мне этого добиться?

1 Ответ

1 голос
/ 19 июня 2020

Вы получаете текущую единицу работы с использованием IUnitOfWorkManager.

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

Если ваш класс наследует что-то вроде AbpController, BackgroundJob, AbpServiceBase et c ..., вы также можно использовать 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, - Пользовательские-функции-и-представления / index.html # DocHelperMethods

...