gpt4 book ai didi

c# - 如何避免重复的 "using"代码

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:54 25 4
gpt4 key购买 nike

我有一个 wcf api 并希望将所有请求包装在一个事务中

目前我的代码在每个端点看起来都是这样

public MyCompleteList ReadOrganisations()
{
MyCompleteList resp = new MyCompleteList ();
try
{
using (TransactionScope scope = new TransactionScope())
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
DC_Base browser_request = new DC_Base(PROJECT);
browser_request.cmd_user_id = coreDb.GetUserIDFromLoginName(PROJECT,
HttpContext.Current.User.Identity.Name);
resp =
new MyCompleteList (coreSc.User_Read_All_Organisations(browser_request, utils,
validation, coreSc, coreDb));
scope.Complete();
}
else
{
resp.SetResponseNotLoggedIn();
}

}
}
catch (TransactionAbortedException ex)
{
resp.SetResponseServerError();
}
catch (ApplicationException ex)
{
resp.SetResponseServerError();
}
return resp;
}

正如您所看到的,如果我要在每个端点(大约 300 个)中使用“使用”事务范围部分,它将会有很多重复代码。

有没有办法减少重复的数量?

最佳答案

您可以编写一个辅助方法,在将您的实际代码作为 lambda 调用时处理事务逻辑。

    public static T Execute<T>(Func<T> func, TransactionExecutionOptions options = null)
{
options = options ?? TransactionExecutionOptions.Default;

T res;
using (var tx = new TransactionScope(options))
{
res = func();
tx.Complete();
}

return res;
}

根据您的需要,您可以为 Func 提供额外的参数争论;例如,Execute方法还可以打开数据库连接并将其传递给 func(然后将 Func<IDbConnection, T> 作为参数类型)。 YMMV.

以你的例子为例:

public MyCompleteList ReadOrganisations()
{
MyCompleteList resp = new MyCompleteList ();
try
{
resp = Execute(() => {
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
DC_Base browser_request = new DC_Base(PROJECT);
browser_request.cmd_user_id = coreDb.GetUserIDFromLoginName(PROJECT,
HttpContext.Current.User.Identity.Name);
resp =
new MyCompleteList (coreSc.User_Read_All_Organisations(browser_request, utils,
validation, coreSc, coreDb));
scope.Complete();
}
else
{
resp.SetResponseNotLoggedIn();
}
});
}
catch (TransactionAbortedException ex)
{
resp.SetResponseServerError();
}
catch (ApplicationException ex)
{
resp.SetResponseServerError();
}
return resp;
}

如果可能,您还可以分解 SetResponse*()将方法输出到基类或接口(interface)(例如 IMyResponse)中,从而可以在 Execute 中处理这方面的问题方法也是如此。

    public static T Execute<T>(Func<T> func, TransactionExecutionOptions options = null) where T : IMyResponse
{
options = options ?? TransactionExecutionOptions.Default;

T res;
try
{
using (var tx = new TransactionScope(options))
{
res = func();
tx.Complete();
}
}
catch (TransactionAbortedException ex)
{
res.SetResponseServerError();
}
catch (ApplicationException ex)
{
res.SetResponseServerError();
}
return res;
}

关于c# - 如何避免重复的 "using"代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44968952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com