这个问题与技术无关,但我正在使用C#和ASP.NET,并将其用于伪代码。哪种方法更好,为什么?
封装日志记录,事务和异常处理:
protected void Page_Load(object sender, EventArgs e) {
SomeBusinessClass.SomeBusinessMethod();
}
public class SomeBusinessClass {
public void SomeBusinessMethod() {
using (TransactionScope ts = new TransactionScope()) {
doStuff();
ts.Complete();
}
catch (Exception ex) {
LogError("An error occured while saving the order", ex);
}
}
}
}
将日志记录,事务和异常处理委派给调用者:
protected void Page_Load(object sender, EventArgs e) {
using (TransactionScope ts = new TransactionScope()) {
try {
SomeBusinessClass.SomeBusinessMethod();
ts.Complete();
}
catch (Exception ex) {
LogError("An error occured while saving the order", ex);
}
}
}
public class SomeBusinessClass {
public void SomeBusinessMethod() {
doStuff();
}
}
我担心通过在我的业务逻辑代码中引入对日志记录,事务等的依赖,我会使它不那么通用。另一方面,UI代码看起来更清晰。我不能打电话。让我知道我应该考虑的其他因素。
答案 0 :(得分:5)
交易:您的业务层的核心问题,因此它应该绝对处理此问题(尽管您可以通过a unit of work implementation集中处理事务处理。)
更新:我不再同意这一部分了。通常,控制器,演示者或其他顶级调用者是处理事务的最佳位置(the onion architecture) - 在许多情况下,这是定义逻辑工作单元的地方。
异常处理:在每个图层中根据需要使用 - 但仅在业务层when you can actually do something about it中使用它(而不仅仅是记录它)。如果您的基础架构支持一个全局处理程序,请在UI层中使用全局处理程序。
记录:在需要的任何层中使用跟踪或信息记录,只记录顶层的异常。
答案 1 :(得分:2)
使用控制反转:
protected void Page_Load(object sender, EventArgs e) {
new SomeBusinessClass(_logger, _dbcontext, _exceptionhandler).SomeBusinessMethod();
}
更好的一个是
protected void Page_Load(object sender, EventArgs e) {
_mybusinessclass.SomeBusinessMethod();
}
其中_mybusiness类通过IoC容器传递到您的页面,以及填充的_logger,_dbcontext和_exceptionhandler。如果需要手动创建_exceptionhandler,例如“new RedirectExceptionHandler(this)”,那么
protected void Page_Load(object sender, EventArgs e) {
_mybusinessclass.SomeBusinessMethod(new RedirectExceptionHandler(this));
}
现在它真的归结为您的具体设计决策。但是,不知道如何在ASP.NET中使用IoC,因为我使用的是MVC。
另一种选择是使用面向方面编程来捕获异常并进行日志记录。另一个选项(可在www.sharparchitecture.net中获得)是使用方法上的[Transaction]属性以声明方式处理事务。
答案 2 :(得分:1)
任何使UI更薄的东西都会让你的生活更轻松。