【问题标题】:What is the best way to create shared serial port access in Prism 6 multimodule WPF MVVM application?在 Prism 6 多模块 WPF MVVM 应用程序中创建共享串行端口访问的最佳方法是什么?
【发布时间】:2017-04-22 09:37:11
【问题描述】:

长期以来,我定期搜索有关在多模块 Prism MVVM 应用程序中创建对串行端口的共享访问的信息,但没有任何好的论文。因此,我在这里向您致辞。我在 Windows 10 64 位操作系统中使用 MS VS 2015 Professional 开发 C# WPF MVVM Prism 6 应用程序。解决方案包括:

  1. Shell(主窗口)项目。
  2. 多个 Prism 模块项目。
  3. ClassLibrary 项目可从所有这些 Prism 模块进行全局访问 并来自壳牌。

我需要从应用程序中的所有 Prism 模块共享访问一个 SerialPort 实例,以便与外部设备进行通信。 解决共享串口问题的最佳方法是什么? 如果我将 SerialPort 创建为公共静态成员并将其放在上述 ClassLibrary 中的静态类之一中,这种方式会是最好的吗?或者将这样的 SerialPort 实例放在共享服务中会是最好的?或者关于共享 SerialPort 实例的任何其他解决方案都有位置? 所以请告诉我如何在多模块 Prism 6 WPF MVVM 应用程序中定义全局访问的共享 SerialPort?

【问题讨论】:

    标签: c# wpf mvvm prism prism-6


    【解决方案1】:

    在共享类库中为串口创建一个接口,在其中一个模块中实现,注册为单例,随心所欲地使用:

    // in the class lib:
    public interface ISerialPortService
    {
        void SendSomething();
    }
    
    // in a one of the modules:
    public class OneModule : IModule
    {
        public OneModule( IUnityContainer container )
        {
            _container = container;
        }
    
        public void Initialize()
        {
            _container.RegisterType<ISerialPortService, MySerialPortImplementation>( new ContainerControlledLifetimeManager() );
        }
    
        private readonly IUnityContainer _container;
    }
    
    internal class MySerialPortImplementation : ISerialPortService
    {
        // ... implement all the needed functionality ...
    }
    
    // somewhere else...
    internal class SerialPortConsumer
    {
        public SerialPortConsumer( ISerialPortService serialPort )
        {
            _serialPort = serialPort;
        }
    
        public void SomeMethod()
        {
            _serialPort.SendSomething();
        }
    
        private readonly ISerialPortService _serialPort;
    }
    

    我强烈建议不要使用静态类,因为它只会降低您的应用程序的灵活性,并且与服务相比,您一无所获。

    【讨论】:

    • 非常感谢,豪金格。我会听从你的建议。如果我有什么问题,我会写在这里。
    • Haukinger,您(在您的示例中)是否实现了 ISerialPortService 并将其注册为单例在同一个模块中?这里和Bootstrapper中注册的共享服务有什么区别?
    • 实现和注册总是发生在同一个模块中,因为大多数时候,实现是internal,无论如何,模块之间不会相互引用。而且无论你是在一个模块中还是在引导程序中进行并不重要,引导程序,即应用程序,只是另一个具有特殊名称的模块,可以这么说。服务是共享的,因为它的接口是共享的……
    • 所以你把 OneModule 类和 MySerialPortImplementation 类放在同一个 .CS 文件中?
    • 我把它们放在同一个程序集中。一个模块可以跨越多个程序集,两个模块可以存在于一个程序集中,但我还没有遇到过我想要这样做的情况。
    猜你喜欢
    • 2010-12-23
    • 2010-10-08
    • 2019-05-30
    • 2011-01-21
    • 2011-01-07
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多