【问题标题】:Using Serial Port Class Library in Prism MVVM Application在 Prism MVVM 应用程序中使用串行端口类库
【发布时间】:2019-05-30 07:49:12
【问题描述】:

我继承了 WPF/Prism/Unity MVVM 应用程序,我需要链接到通过串行端口进行外部通信的类库中。串行端口库发布错误和消息的事件。

我是 Prism 的新手,但几年前我使用过 Unity。 Prism 应用程序(我们称之为 PrismApp)是一个基本的 PrismApplication,有两个模块:main 和 settings。我的串口库(我们称之为 LibSerial)封装了基本通信协议并发布了三个事件:ConnectionEventReceived、ErrorEvent 和 MessageReceived。 LibSerial 具有 Connect、StartSession 和 Send 的功能。

我的问题是:

  • 在哪里实例化我的 LibSerial?我是为它创建一个模型还是可以在我的基础 PrismApplication 中实例化 LibSerial?
  • 如何将事件发布到我的 ViewModel?我假设我会在某处使用 LibSerial 事件并使用 EventAggregator 将各种 EventArgs 推送到视图模型中?
  • 如何从 PrismApp 中调用我的 LibSerial start/startsession/send 函数?这会是 ViewModel 中调用 pubsub.publish 的 DeleagateCommand 吗?

谢谢大家!

【问题讨论】:

    标签: c# wpf serial-port unity-container prism


    【解决方案1】:

    我在哪里实例化我的 LibSerial?

    在您的引导程序中注册它并让容器实例化它。在App.xaml.cs 中覆盖PrismApplication 类的RegisterTypes 方法并注册LibSerial 类型:

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterSingleton<ILibSerial, LibSerial>();
    }
    

    然后您可以使用ILibSerial(在本例中是LibSerial 类实现的接口)注入您的视图模型,并像往常一样连接其事件并访问其成员:

    public class ViewModel
    {
        public ViewModel(ILibSerial libSerial)
        {
            libSeriel.MessageReceived += ...;
        }
    }
    

    容器将负责实例化,并且如果您在引导程序中使用 RegisterSingleton 方法注册类型,则只会创建一个实例并在所有视图模型之间共享。

    【讨论】:

    • 可以注入参数吗?我有一个我希望使用 Unity 实例化并通过构造函数传入的 IMessages 接口?
    • 注入IMessagesILibSerial有什么区别?
    • ILibSerial 使用 IMessage 来解码消息。 LibSerialVariant1 的构造函数是 public LibSerialVariant1(IMessages messages);
    • 在注册 ILibSerial 之前以相同的方式注册 IMessage。那么容器在创建 LibSerial 时应该能够解析它。
    • 但是如果您有其他问题,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2017-04-22
    • 2018-10-01
    • 1970-01-01
    • 2016-02-20
    • 2012-07-17
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多