0

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

由于错误/异常,可能会发送消息以报告进度等。最初我想使用类似 log4net 的东西来报告消息数据,并在应用程序级别有一个自定义附加程序来使用这些消息,然后将它们显示/记录为合适的。但是,由于几个问题,我不确定这是最好的方法

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

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

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

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

我的印象是模型代码应该尽可能地无依赖,这样它就可以不加修改地放入任何应用程序框架中。

你们有什么感想?

4

1 回答 1

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 并将其注入到模型类的构造函数中。在上面的模型类中,我将接口注入到构造函数中。这使我可以访问 Messenger,但如果以后需要,我可以更改底层实现。

于 2012-11-26T09:25:13.033 回答