视图模型是否应包含记录器?

时间:2012-01-30 19:40:36

标签: c# design-patterns mvvm

MVVM新手......我注意到我们的ViewModel正在执行以下操作:

  1. 他们正在处理自己的例外
  2. 他们直接实例化log4net记录器
  3. 我的意见:
    在我看来,我们应该创建一个包装log4net的静态日志记录助手类,所有对象都应该引用它。通过这种方式,我们可以随时轻松地更改日志记录实用程序

    除了在极少数情况下,我不认为模特&查看模型对象(或类似对象)应该捕获或管理错误。唯一一次我们应该捕获错误(在任何类型的模型中)是当我们确信我们无法轻易修复它时,因此,我们必须尽可能优雅和简洁地处理它。即便如此,我们必须小心不要使用异常来管理正常的逻辑流程(参见下面的示例)。我们应该让更高层次的记录和更新处理异常(即UI层)。模型或视图模型的唯一工作应该只是...成为模型或视图模型...主要是因为其他事情会简单地混乱代码。但也因为我觉得它创造了更好的分离。我不会在数据传输对象(DTO)中将日志实用程序放在模型或视图模型中。一旦我这样描述......我想我们可以很容易地理解为什么我会这样。

    我所说的处理正常逻辑流程的一个例子:

    MealExpenses expenses = expenseReportDAO.getMeals(employee.Id)
    expenses.ForEach(x => {
    Try
    {
       total += expenses.getTotal();
    }
    Catch(MealExpensesNotFound ex)
    {
       total += getMealPerDiem();
    }
    })
    

    ......我相信你能明白为什么上面的考试很糟糕。

    我的问题是:
    视图模型是否应包含记录器?它该怎么办?它应该做什么?你们觉得怎么样?

3 个答案:

答案 0 :(得分:4)

ViewModel应该是视图所使用的数据的简单容器,并且不应该没有直接与视图关联的行为(例如,单击处理程序)。即使它所拥有的行为也应该委托给Model

因此,ViewModel应该非常简单,它实际上不需要记录任何内容。这应该留给应用程序基础架构。

答案 1 :(得分:0)

我不明白为什么不。通常,视图模型位于应用程序集中,而不在库项目中。在创建库时,抽象记录器可能是有意义的,但在GUI应用程序中没有必要。无论如何,应用程序将依赖于记录器库。除非您计划每周更换记录器,否则无需执行此操作。

答案 2 :(得分:0)

当然,ViewModel可以包含一个Logger,但只需确保它的界面,以便可以模拟它。您不希望视觉工作室设计师使用非模拟记录器。 IMO,如果你真的想要进行客户端日志记录,那么最好使用你最喜欢的IoC容器注入ILoggerService。