在模型中使用MVVM Light引用

时间:2012-11-24 21:22:40

标签: mvvm mvvm-light

在我正在研究的项目上,我正在尝试开发一种通用机制,用于从代码库中的任何位置向前端发回消息,以便进行可能的日志记录,向用户显示等。

可能因为错误/异常而发送消息,报告进度等。最初我想过使用log4net之类的东西报告消息数据,并在应用程序级别有一个自定义appender来使用这些消息,然后显示它们/根据需要记录它们。但是,由于一些问题,我不确定这是最好的方法

1)项目分为多个单独的程序集,我发现在多个dll中配置log4net存在问题。

2)此消息传递方案不仅仅是日志记录,因此使用日志记录框架可能过于严格。

目前我正在使用C#自定义消息事件从程序集发送数据并在应用程序级别注册处理程序以捕获它们。

但是我已经意识到MVVMLight中的Messenger类正是我正在寻找的,一种跨程序集发送通用数据包(类)的方法。但是因为我可以从模型代码发送消息,我想知道这是否会在模型代码中添加不必要的MVVMLight依赖。

我的印象是模型代码应该尽可能没有依赖关系,这样就可以将它放到任何应用程序框架中而无需修改。

你们有什么想法?

1 个答案:

答案 0 :(得分:0)

如果您正在尝试这样做,那么您应该使用Messenger类。

模型代码将被其他应用程序使用的可能性(真的)?如果它是通用的(用户首选项,安全性等),那么您可能希望在其他地方使用它,但如果您提供定制的业务数据,那么YAGNI

从良好做法的角度来看,我建议做这样的事情:

public interface IMessenger<T>
{
    public void Send(T message);
}

public class MessengerProxy:IMessenger<ErrorDto>
{
    public void Send(ErrorDto error)
    {
        Messenger.Default.Send(error);
    }
}

public class AnotherModel
{
    public AnotherModel(IMessenger<ErrorDto> errorRegister)
    {
        _errorRegister=errorRegister;
    }

    private RegisterError(Exception ex)
    {
      var dto=new ErrorDto(ex,"My Title");
      _errorRegister.Send(dto);
    }
}

在MVVM Light中注册MessengerProxy并将其注入Model类的构造函数中。在上面的模型类中,我将接口注入构造函数中。这使我可以访问Messenger,但如果我以后需要,可以让我更改底层实现。