在我的.NET Core應用程序中,我有一個裝飾器類,我希望能夠通過在TransactionScope中包裝數據庫命令的執行來處理事務。不幸的是,對於TransactionScope的支持似乎不會通過.NET Core 2的發佈將其轉換爲SqlConnection:https://github.com/dotnet/corefx/issues/19708:.Net沒有TransactionScope的核心事務裝飾器
在沒有TransactionScope的情況下,我不確定解決此問題的最佳方法。隨着的TransactionScope,我的交易裝飾看起來是這樣的:
public class TransactionCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> decorated;
//constructor
public void Handle(TCommand command)
{
using (var scope = new TransactionScope())
{
this.decorated.Handle(command);
scope.Complete();
}
}
}
目前,ICommandHandler的每一次實施得到一個實例我DapperContext類和處理命令是這樣的:
public void Handle(UpdateEntity command)
{
var sql = Resources.UpdateEntityPart1;
this.context.Execute(sql, new
{
id = command.Id;
});
var sql = Resources.UpdateEntityPart2;
//call Execute again
}
的DapperContext類有一個連接工廠爲每次調用Execute方法提供新的連接。因爲命令處理程序可能必須爲單個TCommand執行多個數據庫寫入操作,所以我需要在出現問題時能夠回滾。必須在創建連接的同時創建事務(在DapperContext中)意味着我無法保證跨連接的事務行爲。
的一個替代方案,我認爲似乎並沒有全部滿足:
- 在命令處理程序級別管理連接和事務,然後將該信息傳遞到短小精悍的上下文。這樣,給定命令的所有查詢都使用相同的連接和事務。這可能會起作用,但我不喜歡讓我的命令處理程序負擔這個責任。就整體設計而言,DapperContext成爲擔心連接的地方似乎更自然。
我的問題是:有沒有什麼辦法可以在沒有使用TransactionScope的情況下編寫事務裝飾器,因爲.NET Core中的SqlConnection的當前限制?如果不是,下一個最佳解決方案是不是太違反單一責任原則?
如果我是你,我會對那個特殊的Girhub問題發表評論,向微軟解釋這是一個主要的不兼容問題,絕對應該修復。如果TransactionScope在Core 2中不起作用,我認爲這對許多遷移組織來說是一個主要問題。 – Steven