设计问题 - 业务层方法应该如何原子化?

时间:2009-11-19 17:56:25

标签: c# asp.net business-logic

这个问题与技术无关,但我正在使用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();
        }
    }
    
  3. 我担心通过在我的业务逻辑代码中引入对日志记录,事务等的依赖,我会使它不那么通用。另一方面,UI代码看起来更清晰。我不能打电话。让我知道我应该考虑的其他因素。

3 个答案:

答案 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更薄的东西都会让你的生活更轻松。