围绕一个功能与行动

问题描述:

我正在开发一个Asp.net MVC应用程序,并且我创建了一个错误处理系统,迫使我在BLL中为每个函数创建以下代码。围绕一个功能与行动

try 
{ 
    ... 
    _unitOfWork.Save(nameof(Function)); 
} 
catch 
{ 
    if (rollbackTo != null) 
    { 
     _unitOfWork.RollbackToSave(rollbackTo); 
    } 
    else 
    { 
     _unitOfWork.Rollback(); 
    } 
    throw; 
} 

这基本上可以让我管理我的交易根据要求和管理事务的错误处理没有我的控制器知道关于实际的方式,这是正在做的 - 它只允许它来决定是否交易将继续(rollbackTo参数)

我想知道的是,有没有办法让我不必一遍又一遍地写这段代码?我想抛出一个异常,然后在我的管道中处理它 - 但是因为我需要向用户返回一个有价值的响应,而不仅仅是一个500个代码 - 这不是一个真正的选择。我想过可能创建一个调用和抽象方法的基类 - 并且按照函数实现它 - 但这也不起作用,因为参数可能会改变。有任何想法吗?

是的,这是相当标准的。

例如,在基类

public void DoSomethingAndRollbackThenThrow(Action<IUnitOfWork> action) 
{ 
    try 
    { 
    ... 
    action(_unitOfWork); 
    } 
    catch 
    { 
    if (rollbackTo != null) 
    { 
     _unitOfWork.RollbackToSave(rollbackTo); 
    } 
    else 
    { 
     _unitOfWork.Rollback(); 
    } 
    throw; 
} 
} 

然后你就可以从派生类中调用它像这样

public void DoSomethingSpecific() 
{ 
    base.DoSomethingAndRollbackThenThrow(unitOfWork => { 
    _unitOfWork.Save(nameof(Function)); 
    }); 
} 

您可以使用AOP(面向方面​​编程)框架。 只需执行一次并添加一些属性,就可以将某些功能“编织”到您的方法中。

更多关于AOP: https://en.wikipedia.org/wiki/Aspect-oriented_programming

一个易于使用的开源AOP框架: https://github.com/AntyaDev/KingAOP

也有一堆的替代品(包括商业和开源)的。 Google可能会为您提供有关替代方案的良好结果