Каков наилучший способ создания общего последовательного порта в многомодульном приложении WPF MVVM для Prism 6?

В течение долгого времени я периодически искал информацию о создании общего доступа к последовательному порту в многомодульном приложении Prism MVVM, но хороших статей нет. Поэтому я обращаюсь к вам здесь. Я разрабатываю приложение C# WPF MVVM Prism 6 с использованием MS VS 2015 Professional в 64-битной ОС Windows 10. Решение состоит из:

  1. Оболочка (главное окно) проекта.
  2. Проекты с несколькими модулями Prism.
  3. Проект ClassLibrary с глобальным доступом из всех этих модулей Prism и из Shell.

Мне нужен общий доступ к одному экземпляру SerialPort из всех модулей Prism в приложении для связи с внешним устройством. Каков наилучший подход для решения этой проблемы с общим последовательным портом? Если я создам SerialPort как открытый статический член и поместу его в один из статических классов в вышеупомянутой ClassLibrary, будет ли этот способ лучшим? Или лучше поместить такой экземпляр SerialPort в общий сервис? Или есть какие-либо другие решения об общем экземпляре SerialPort? Поэтому, пожалуйста, посоветуйте мне, как определить общий SerialPort с глобальным доступом в многомодульном приложении Prism 6 WPF MVVM?

1 ответ

Создайте интерфейс для последовательного порта в разделяемой библиотеке классов, внедрите его в один из модулей, зарегистрируйте его как singleton и используйте его где угодно:

// 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;
}

Я настоятельно рекомендую использовать статический класс, потому что он делает ваше приложение менее гибким, и вы ничего не получаете по сравнению с сервисом.

Другие вопросы по тегам