MCLS Notes

MainToolbar View工具

Button Click Event handle àMainToolbar.xaml.cs OnConnect() functionàService.Messenger.Send(new NewConnectionEventArgs())单元测试

MainToolbar Viewmodel学习

_messenger.Register<NewConnectionEventArgs>(this, OnOpenNewConnetionWindow)à OnOpenNewConnetionWindow àPopupWindowShowupàNewConnectControlàbtnConnect_Clickà测试

……ui

主要写四个部分如何实现(流程等)this

1. 程序启动spa

Shell (GetView top,main status, LoadWindowIcon etc.)à线程

MCLSPlugin(Constructor, Register IoC objects new ViewModels; new UI componentscomponent

MainViewModel(Constructor, new MainToolBarViewModel; ControlPanelViewModel(including ChannelViewModel); )à对象

MCLSUI(Constructor, new MainToolbar; MainUI(including FrontPanel); StatusBar)

2. 连接硬件,显示状态

MainToolbar(Click Connect Button)à

MainToolbarVM(OnOpenNewConnectionWindow, Refresh available COM ports, new an instance of NewConnectControl, wait for user input)à

NewConnectControl(Click Connect Button, Get user input port number then Send Message Call MainToolBar.xaml.cs OnConnect function )à

MainToolBar OnConnect(DeviceConnectingEventArgs e) (open device and start monitoring port, update data to ControlPanelViewModel, trigger Controlpanel set default value)

3. 经过软件更改设备的运行状态

Click on one channel (FrontPanel Binding ChannelClickCommand)à

ControlPanelViewModel(OnClickChannel, set property SelectChannelViewModel)à

ChannelViewModel(set IsSelected property, Binding with FrontPanel get/or set other properties,and update UI)

4. 多语言支持

------------------------------MCLS-----------------------------------------

Maintoolbar (Click Options Button)à

Maintoolbar VM (New Option Window, set some properties, Open)à

-----------------------------Share library---------------------------------

OptionWindow (Binding OptionModel View element, Create instance by ViewType[LocalizationOption, ManufacturerDefaultView])à

LocalizationOption(via LocalizationService to Query status or do some operation, SupportLanguages,CurrentLanguage Add handler to SelectionChanged event)à

LocalizationService(main class of process multi-language support, maintain a group of SupportLanguage Class, notify binding target current language has changed.)à

SupportLanguage(Control load/unload XML file, lookup keys in built-in dictionary feedback actual value)

====================================================================================

IMessenger 用于在程序的各个模块中发送命令进行通讯。

ILocalizationService 用于Support多语言环境

Unity

控制反转(Inverse of control): 某一接口具体实现类的选择控制权(控制)从调用类中移除,转交给第三方决定(反转)。依赖对象的获取被反转了。目的是削减计算机程序的耦合问题。解除合做对象之间引用的耦合。

依赖注入(Dependency Injection):由容器来帮忙建立及注入依赖对象,对象只是被动的接受依赖对象。

由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

MVVM Light

Register<TMessage>(Object, Action<TMessage>)

Registers a recipient for a type of message TMessage. The action parameter will be executed when a corresponding message is sent.

Registering a recipient does not create a hard reference to it, so if this recipient is deleted, no memory leak is caused.

Shared Library

PoolingService 用于向设备轮询当前值或者Monitor其余对象等。

DataService 用于控制硬件开启、关闭,以及获取数据。

LocalizationService 用于多种语言的Support

WPF引入的一个新的概念,嵌套消息泵,就是在一个While(GetMessage(...))内部又启动了一个While(GetMessage(...))。

Dispacher

每调用一次Invoke和BeginInvoke,即向Dispatcher中加入了一个任务,而且发送消息通知Render(呈现)线程更新界面显示。

AR:

1. 研究PoolingService的做用?何时用?

2. Unity的ServiceLocator究竟起什么做用,如何使用?

3. MCLS在轮询data(轮询线程)如何避免与 SetValue(主线程)冲突?

4. XAML DataTemplate,relative binding表明什么含义,学习。

5. 使用串口通信工具向MCLS发送、接收命令。

【DataService】

Initial:

生成SerialQueue存放task的集合 。

启动另外一个线程按顺序执行SerialQueue中的每一个Task,确保一次只有一个task被执行。

SetValue所起到的做用只是向SerialQueue中添加任务,交由其余线程执行后获取返回值。所以不会与其余的task产生冲突。

参考TryGetDeviceValue之流程:

1. New a delegate to call get device value API

2. Add new job into task queue.

3. Let queue process thread execute.

4. Wait and get result from last job.

【PoolingService】

1. 向宿主程序集当中不断发送GetDeviceValueArgs类型的消息(经过MVVM的Messenger传递)

2. 驱动ControlPanelViewModel的OnPooling,将当前的设备状态(选中那个channel、系统是否被enable、channel的实际value)同步到前台界面显示。

【ServiceLocator】

Service Locator模式想要解决的问题是解耦合服务提供者和用户,用户无需直接访问具体的服务提供者类。

服务定位器模式的优缺点

服务定位器模式在带来解耦和、可维护性、动态升级服务等好处的同时,也带来一些很差的方面,好比

一、因为用户没法确切知道服务提供者的真实状况,那么若是出现错误,难以定位

二、集中式、单例的注册机是并行计算、系统扩展的瓶颈

三、因为须要集成全局的服务注册代码,执行单元测试也会麻烦些

四、注册机隐藏了类的依赖关系,使得原本在编译期能够暴露的问题,在运行时才发生

MCLS程序中不须要给每一个ViewModel传入container,而后再调用container的Resolve方法。例如:

_localService = container.Resolve<ILocalizationService>();

等价于

ServiceLocator.Current.GetInstance<ILocalizationService>();

【XAML Data Template】

相关文章
相关标签/搜索