视图模型应该包含记录器吗?

问题描述:

新来MVVM ......和我注意到我们的视图模型的在执行以下操作:视图模型应该包含记录器吗?

  1. 他们正在处理自己的异常
  2. 他们被实例化log4net的记录器直接

我见:
在我看来,我们应该创建一个包装log4net的静态日志帮助类,所有对象都应该引用它。通过这种方式,我们可以随时轻松更换日志记录工具,只要我们想要最小化

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

什么,我的意思是逻辑的手柄正常流动的一个例子:

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

...我敢肯定,你可以看到为什么上述examlpe是坏的。

我的问题是:
如果一个视图模型包含一个记录?它应该做什么?它不应该做什么?你们有什么感想?

+0

只是关于你的代码的一个单独的注释:我不会像使用正常的业务逻辑那样使用异常。 – Fernando 2012-01-30 20:43:48

+0

@Fernando你是对的。但是,我猜你可能没有阅读该段落,因为这个例子已经被标记为不好。这是为了强化我反对登录视图模型的观点:逻辑是在此级别记录异常会引发使用异常来管理正常逻辑流程的诱惑。众所周知,这是不好的。谢谢! – 2012-01-30 21:35:27

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

因此,作为ViewModel应该很简单,它确实不需要记录任何东西。这应该留给应用程序基础架构。

+0

我完全同意你的初步评论。但是,你是否也在说:“模型应该记录日志?”因为我有点不同意这一点。 – 2012-01-30 20:20:48

+0

我想我反对把视图模型放入视图模型的观点是视图模型不能重定向到其他页面或以有趣的方式显示错误(也不应该)。它应该是什么......简单地说......一个视图模型。上层应该做他们在这方面做得最好的。 Waddya想? – 2012-01-30 20:24:19

+0

@*erZERO - 我同意你对“ViewModel”的责任所说的话。如果不是这样表达的话,那就是我的观点。 – Oded 2012-01-30 20:27:03

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

当然,一个ViewModel可以包含一个记录器,但只要确保其接口可以被模拟。你不希望你的视觉工作室设计师使用unmocked记录器。海事组织,如果你真的想做客户端日志记录的话,使用你最喜欢的IoC容器来注入ILoggerService是个好时机。