看了很多的回複,謝謝大家的關注!
今天我想寫個例子,簡單說下如何使用這個架構開始新的項目並實現一個典型的CRUD功能。期間我還想說說關於各種UI組件間資訊互動和調度方面的問題。這個組件一直在修修補補,基本穩定後也沒有真正的仔細考慮過是否有更好的實現方式,通過簡單的說明希望能把我的思路也理理清楚。大家也多多拍磚。
開始一個新的項目,首先要做的是建立一個主表單,它直接從WorkbenchBase繼承即可。
Partial Class MainForm
Inherits Component.WorkbenchBase
…………….
End Class
完成上面代碼後,就可以得到這樣一個具備基本的菜單、手風琴和使用者組件區的表單。
由於業務功能沒有具體實現,所以手風琴菜單什麼都沒有。而主菜單中除了與業務動作緊密關聯的[編輯] 功能表外,其他功能表項目WorkbenchBase以預設提供。
主表單有了以後,我們可以在實現一個典型的CRUD功能。
上一篇中以提到,實體編輯組件(EntityControl)用於處理一個業務實體的使用者互動介面,一次做CRUD功能首先要建立一個自訂控制項,然後修改代碼,讓他繼承自EntityControl。
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class MyEntityContorl
Inherits Component.EntityControl
…………….
End Class
而後需要把實體中的欄位控制項逐個定義到這個控制項上,如
需要注意的是,為了能夠完成組件與業務實體自動進行賦值和取值,要為需要進行資料互動的控制項的Tag屬性填寫上相應的實體屬性名稱。
如果實體組件上有需要資料繫結的組件,比如Combobox等,則重寫InitBindableControl方法,把綁定的具體實現再在該方法內。
Public Class MyEntityContorl
''' <summary>
''' 實現可綁定組件的Binder 方法
''' </summary>
''' <remarks></remarks>
Public Overrides Sub InitBindableControl()
MyBase.InitBindableControl()
End Sub
End Class
實體組件通過反射調用相應的方法完成CRUD操作,預設方法名新增為“INSERT”,刪除為“DELETE”,修改為“UPDATE”。如果需要變更相應方法名可以改寫下面的屬性。
Public Overrides ReadOnly Property InsertMethodName() As String
Get
Return MyBase.InsertMethodName
End Get
End Property
Public Overrides ReadOnly Property UpdateMethodName() As String
Get
Return MyBase.UpdateMethodName
End Get
End Property
Public Overrides ReadOnly Property DeleteMethodName() As String
Get
Return MyBase.DeleteMethodName
End Get
End Property
如果實體控制項還需要提供額外的業務操作(如審核等),自己新增相應的方法即可。
此時的使用者編輯組件並不知道他要編輯的業務實體物件是什麼,由於大部分的CRUD操作在網格組件(GridView)中發起,此類情境下GridView會自動為使用者編輯組件的DataSource賦值。在少數情境下,如果一個使用者編輯組件需要獨立使用,則需要自己編碼為使用者編輯組件設定DataSource和State(新增、修改、刪除等狀態)屬性,以便使用者編輯組件能夠知道他要處理的實體物件和處理方法。如下面的代碼:
entityControlHost.State = New EntityControlHostAddNewState()
entityControlHost.EntityControl.DataSource = r
到此為止一個實體編輯組件就完成了,他已經具備的與業務實體進行資料互動,CRUD的業務動作的自動調度等功能。由於重點在UI架構的介紹,具體CRUD的實現過程不再說明。
實際應用中,一個程式的介面組織形式有可能有兩種顯示方式:MDI和SDI。架構通過LayoutBehavier同時支援這兩種方式,但是有些我們遇到的系統中的某些功能只能以MDI形式展現,由此可能造成有些SDI顯示正常的組件在MDI中顯示異常,因此我們需要為每個實體編輯組件定義一個容器,這個容器一方面可以提供SDI和MDI的支援,另外可以實現命令按鈕,業務調度與實體編輯組件松耦合,避免重用的局限性。實體編輯組件的容器分為兩類:EntityTabbedHost和EntityDialogHost,分被對應MDI和SDI。其中EntityDialogHost可以在MDI和SDI中系統自動甄別使用,EntityTabbedHost只能應用在MDI中。
那麼就可以為MyEntityControl定義一個容器,
讓這個組件整合EntityDialogHost,得到下面的表單:
而後把剛才做好的實體編輯組件添加到這個表單中。
並在代碼中填寫下面內容
Public Overridable Property EntityControl() As EntityControl Implements IEntityControlHost.EntityControl
Get
Return MyEntityControl1
End Get
Set(ByVal value As EntityControl)
MyEntityControl1 = value
End Set
End Property
此時,一個完整的實體編輯功能做完了。他已具備的儲存、刪除等基本的命令按鈕,並實現了相應的調度功能,如果需要增加額外的業務命令,直接增加按鈕並完成相應處理代碼即可。
後面我們在做一個這個實體的網格組件,讓這個功能更完整。
貼圖太費勁了,很簡單,我就文字描述了,首先定義一個自訂群組件,讓這個組件整合GridView,此時獲得下面的控制項。
使用設計器,添加相應的列,即可完成網格組件的定義。如果實體編輯組件中有額外的業務處理(如審核等),可以把他以功能表項目的形式定義在編輯或系統中,後面架構會自動與主菜單合并。以保證架構業務調度和展現的一致性。
此時該組件已具備了網格自訂(列,條件樣式等,其實這個很好做都是Janus組件的一個功能整合)及CRUD及其他業務功能的調度能力。
並且他不需要而外定義容易,因為系統會自動根據LayoutBehavier的MDI和SDI狀態決定他的展現形式。
至此CRUD的功能都做完了,剩下就是拼裝這個功能。
拼裝過程原來是參照SharpDeveploer用外掛程式做的,包括依賴關係等,後來感覺開發規模有限,調試也很麻煩就放棄了。
簡單說下拼裝過程,首先在一個業務功能對應著一個FolderItem,多個FolderItem構成一個Folder,一個Folder對應著主表單上左側手風琴菜單的一組。
為了把上面的業務功能增加到系統中,需要以下代碼:
Public Class CustomerFolder
Inherits Component.Folder
Public Sub New()
Init()
End Sub
Sub Init()
Dim item As FolderItem
item = New FolderItem
Text = "XXXXX管理"
ImageName = Application.StartupPath + "\images\basedata.bmp"
item.FolderName = "XXXXX管理"
item.FolderOrder = 1
item.FolderGroup = "XXXXX管理"
item.IconName = "small75.bmp"
item.Subject = "XXXXX管理"
item.ViewFullName = "CustomerView"
item.BusinessServiceFullName = "DAL.CustomerProvider"
item.BusinessMethodFullName = "GetAll"
AddFolderItem(item)
End Sub
End Class
而後在MainForm(Workbench)中重寫CreateFolders()方法
Public Overrides Function CreateFolders() As Component.FolderKeeper
Dim folders As New Component.CustomerFolder
Dim b As BaseFolder = New BaseFolder
folders.Add(b)
Return folders
End Function
其實上面的資訊之前是卸載設定檔或資料庫裡,那樣就代碼整潔些,但是可讀性會稍差,改成這樣也不滿意,糾結。
下面完成啟動代碼,就大功搞成了~
''' <remarks></remarks>
Public SubMain()
Application.SetCompatibleTextRenderingDefault(False)
Application.EnableVisualStyles()
Dim mainForm As New MainForm
mainForm.BusinessBehavier = New WcfBusinessBehavier
mainForm.LayoutBehavier = New TabbedLayoutBehavier
mainForm.ServiceManager = New Component.ServiceManager
mainForm.ServiceManager.ValidateService = New ValidateService
'其他服務和Bevhavier暫時不需要,不寫了
System.Windows.Forms.Application.Run(mainForm)
End Sub
當然完美的話很多工作要做,但是基本的功能都說明就可以了。運行一下吧:
最簡單的CRUD就這麼做了,省去了很多賦值取值的麻煩,介面風格統一了,業務功能一致性有保障而且所有調度功能都不用重複寫。
還是那句話,拋磚引玉,歡迎大家用力扔玉,最好是藍田玉,呵呵。