【发布时间】:2014-08-06 09:37:17
【问题描述】:
我有一个类,其中包含许多用于管理数据库操作的静态方法。所有方法都遵循这种模式:
try
{
using(var trans = new TransactionScope())
{
using(var context = new DBContext())
{
. . . // method body
}
trans.Complete();
}
}
catch(Excepcion ex)
{
Log.Error(ex.Message);
if (ex.InnerException != null)
Log.Error(ex.InnerException.Message);
}
我怎样才能重构我的代码,这样就不需要在每个方法中都写这个结构了?
编辑以实现 Jon 的响应。
public static T TransactionalOperation<T>(Func<DBContext, T> databaseAction)
{
T retVal = default(T);
try
{
using (var trans = new TransactionScope())
{
using (var context = new DBContext())
{
if (databaseAction != null)
retVal = databaseAction(context);
}
trans.Complete();
}
catch (Exception ex)
{
Log.Error(ex.ToString());
}
return retVal;
}
public static void TransactionalOperation(Action<DBContext> databaseAction)
{
TransactionalOperation(context =>
{
databaseAction(context);
return string.Empty;
});
}
并像这样使用:
public static string GetUserLanguage(string owner)
{
return
TransactionalOperator(context => context.clients.Single(c => c.Id == owner).Language);
}
【问题讨论】:
-
仅供参考 -
ex.ToString()比ex.Message更有用很多。 -
您正在寻找模板方法模式
标签: c# entity-framework design-patterns try-catch using