3

这个问题与技术无关,但我正在使用 C# 和 ASP.NET 并将其用于伪代码。哪种方法更好,为什么?

  1. 封装日志、事务和异常处理:

    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);
                }
            }
        }
    }
    
  2. 将日志记录、事务和异常处理委托给调用者:

    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 代码看起来干净多了。我不能打电话。让我知道我应该考虑哪些其他因素。

4

3 回答 3

5

事务:业务层的核心问题,因此它绝对应该处理这个问题(尽管您可能通过工作单元实现来集中事务处理)。

更新:我不再同意这部分。通常,控制器、演示者或其他顶级调用者是处理事务的最佳位置(类似于洋葱架构)——在许多情况下,这是定义逻辑工作单元的位置。

异常处理:根据需要在每一层中使用 - 但仅在您可以实际做某事时才在业务层中使用它(不仅仅是记录它)。如果您的基础架构支持,请在 UI 层使用全局处理程序。

日志记录:在需要的任何层使用跟踪或信息日志记录,仅在顶层记录异常。

于 2009-11-19T18:02:47.590 回答
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));
}

现在它真的归结为您的具体设计决策。不过,由于我使用 MVC,所以不知道如何在 ASP.NET 中执行 IoC。

另一种选择是使用面向方面的编程来捕获异常并进行日志记录。另一个选项(在 www.sharparchitecture.net 中可用)是使用方法上的 [Transaction] 属性以声明方式处理事务。

于 2009-11-19T18:23:11.150 回答
1

任何使 UI 更薄的东西都会让你的生活更轻松。

于 2009-11-19T17:58:17.320 回答