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】

相關文章
相關標籤/搜索