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