在MSDN上瀏覽Smart Client時發現了CAB(Composite UI Application Block) ,一下被它的描述吸引了,下載後掃了一遍源代碼,的確是值得好好研究一番,以後的開發中就用它了。
今天學習了Lab 1: Introduction to Developing with the Composite UI Application Block 。感覺界面的組合佈局上和ASP.NET2.0中的WebParts有點類似(對webparts只是瞭解一點,沒用過:D).這樣在對付一些複雜界面時的確會方便許多。由於對Inversion of Control (IOC) 和 Dependency Injection 不太瞭解,所有看起來還是很費勁的。只好先照着例子試驗一下,先有個感性的認識再說。
在這個例子中對GPSModule的調用是通過ProfileCatalog.xml的配置來實現的。我想如果用戶損壞了此配置文件怎麼辦?是不是自己做個維護配置文件小工具,可以通過可視界面來初始化、修改配置信息較好。
今天瞭解了一下內容:
1、模塊配置文件名必須是ProfileCatalog.xml嗎?
通過跟蹤program.Run()發現在基類CabApplication的Sub Run()中調用LoadModules()時加載默認的配置文件名是在SolutionProfileReader類中定義的:
Private innerCatalogFilePath As String = DefaultCatalogFile
''' <summary>
''' The default profile to use if no profile is specified.
''' </summary>
Public Const DefaultCatalogFile As String = "ProfileCatalog.xml"
''' <summary>
''' Initializes a new instance which will use the <see cref="DefaultCatalogFile"/> as
''' the solution profile.
''' </summary>
Public Sub New()
End Sub
''' <summary>
''' Initializes a new instance that will use the specified file as the solution profile.
''' </summary>
''' <param name="catalogFilePath">The path to the solution profile. This file must be
''' located under the application folder.</param>
Public Sub New(ByVal catalogFilePath As String)
Me.innerCatalogFilePath = GetFullPathOrThrowIfInvalid(catalogFilePath)
End Sub
'其他...
End Class
此類的重載構造函數Sub New(ByVal catalogFilePath As String)說明還是可以修改配置文件名的。
2、服務的兩種加載類型
a)在CabApplication的Sub LoadModules()調用時自動加載到內存中。
b) 在服務被首次調用時才加載。
需要在服務類增加屬性並指定AddOnDemand爲True , 比如:
<Service(GetType(IDistanceCalculatorservice), AddOnDemand:=True)> _
Public Class DistanceCalculatorservice
Implements IDistanceCalculatorservice
Public Function ComputeDistance(ByVal latitude As Integer, ByVal longitude As Integer) As Integer Implements IDistanceCalculatorservice.ComputeDistance
Return 1234
End Function
End Class
3、GPSWorkItem中顯示GPSView的WorkSpace控件名稱必須和主界面中DeckWorkspace控件的Name一致,是否可以通過配置取消這種硬編碼上的依賴?
Inherits WorkItem
Protected Overrides Sub OnRunStarted()
MyBase.OnRunStarted()
'“MainWorkspace”爲主窗體中DeckWorkspace的Name
Dim GPSWorkspace As IWorkspace = Workspaces("MainWorkspace")
GPSWorkspace.Show(Items.AddNew(Of GPSView)())
End Sub
End Class
4、可以把一個Form顯示到WorkSpace中嗎?
可以的,但是需要在Form的構造函數中設置窗體的TopLevel=False 。
Public Sub New()
' 此調用是 Windows 窗體設計器所必需的。
InitializeComponent()
' 在 InitializeComponent() 調用之後添加任何初始化。
'必須將TopLevel設置成False才能將此窗體添加到WorkSpace中
Me.TopLevel = False
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.Dock = Windows.Forms.DockStyle.Fill
End Sub
End Class
Public Class GPSWorkItem
Inherits WorkItem
Protected Overrides Sub OnRunStarted()
MyBase.OnRunStarted()
'“MainWorkspace”爲主窗體中DeckWorkspace的Name
Dim GPSWorkspace As IWorkspace = Workspaces("MainWorkspace")
GPSWorkspace.Show(Items.AddNew(Of Form1)())
End Sub
End Class
時間不早了,天亮了還要出差去奉賢,過去又不能上網咯,等下週回來了再研究吧!