信息化基础建设 开发框架
開發框架
1. ORM, LLBL Gen,NHibernate
2. 接口與實現分離,界面與邏輯分離,分五個項目,
??? BusinessLogic, Interface,Manager,Validation,EntryForm
3. SQL與ORM
4. 通訊集成 Remoting/WCF
5. Control/Component: NumberiEditor,TextEditor,Grid,ComboBox,ListBox,ListView,Tree
6. 異常
7. 元數據
?
ORM
使用ORM可以減少大量的數據讀寫和綁定代碼,做大型的項目,必須用ORM
再配合CodeSmith代碼生成器,可以完成數據讀寫90%的代碼。
?
界面與邏輯分離
做一個MIS的庫存項目,有四個項目
BusinessLogic 業務邏輯,業務實體
Interface 接口
Manager 實現接口
System Administration/Inventory, 界面
這樣達到的效果,
1. 數據表新增加字段,界面部分不需要任何改動;
2. 可以靈活的切換界面到WPF/ASP.NET/Sliverlight
3. 插件式Addon,PlugIn式的開發,新增加功能,不需要改動原有的項目文件
SQL與ORM
ORM是跨平臺的,要兼容所有的主流數據庫,必需創建一種語法,以達到讀寫各種類型的數據庫。
熟悉這個映射表,可以很快的入門,寫出讀寫數據代碼。雖然這個步驟不是必須的(因為CodeSmith代碼生成器會成90%的代碼)。 再配合SQL解析工具,輸入SQL語句,實用程序(SQLTranslate.exe)可以自動翻譯SQL為ORM的寫法。
如果擔憂ORM性能不好,可以直接使用ADO.NET
這個寫法需要工具的配合,才能快速開發.
這個代碼生成器也是組合的方式,例如表名是backupset
| Entity 實體 | BackupSet |
| ADO.NET(Get,Save,Insert,Update,GetList) | BackupSetDAL |
| Interface 接口 | IBackupSet |
| Service 邏輯調用 | BackupSetService |
ASP.NET應用代碼生成器界面如下,配和ADO.NET或是Enterprise Library,具有很強的威力。
最新版本的ASP.NET應用代碼生成器,直接寫成CodeSmith的模板。這樣,在改動生成的代碼時,不需要任何編譯動作。
CodeSmith現有版本只支持.NET 2.0,不支持.NET 3.5和.NET 4.0, 雖然CodeSmith 6.0 Alpha已經釋出,但是非常的不stable.
也沒有Studio可以使用。
?
SQL Profiler 跟蹤查詢
直接運行SQL Profile
運行自己開發的SQL Profiler
啟動程序中增加配置節
<system.diagnostics>
<!-- LLBLGen Trace
Trace Level: 0 - Disabled
3 - Info
4 - Verbose
-->
<switches>
<add name="SqlServerDQE" value="4" />
<add name="ORMGeneral" value="0" />
<add name="ORMStateManagement" value="0" />
<add name="ORMPersistenceExecution" value="0" />
</switches>
<trace autoflush="true">
<listeners>
<add name="socketWriterTraceListener"
type="Avatar.ORMTraceListener,ORMTraceListener" />
</listeners>
</trace>
</system.diagnostics>
開啟監聽程序
源代碼如下
或者運行如下的跟蹤程序
?
改進的智能提示支持
當鼠標懸停在實體名上時,可以顯示實體對應的表名
當鼠標懸停在字段上時,可以顯示字段對應的表名
在SQL查詢管理器中,當鼠標懸停在表名上時,可以顯示表的注釋
創建表的描述
創建字段的描述
導入表中現有的字段描述,以達到最小的勞動量
智能提示的設計演化過程
1. 把提示內容放到Access數據庫中,這樣,拷貝到項目開發目錄中即可。遇到Provider=Microsoft.Jet.OLEDB.4.0 沒有64bit的版本,編譯時必須設置x86的平臺格式,而不是AnyCPU.
增加Provider=Microsoft.ACE.OLEDB.12.0,但是,在每臺開發人員機器上安裝這個組件,不太實現。
2. 使用SQLExpress, 這種方式的問題,還是需要配置SQL,可嘗試用dbo4之類的對象數據庫,一個文件拷貝到指定目錄就可以(可行, doable)
3. SQL Server內置實現方式,如下圖
打開SQL Profiler, 秘密就在存儲過程sp_addextendedproperty
最后,干脆做一個工具,專門用于更新字段的描述,這樣會方便很多。
?
Remoting/WCF通訊技術
功能目標
1. 應用程序服務器 Remoting/WCF Server
2. Report Server
3. Workflow Server
4. 并發用戶控制,跟蹤日志輸出(Trace output),組件授權驗證
?
License 許可控制
用RSA簽名xml文件,生成不可修改的xml文件,以保護軟件授權許可
與硬件(CPU,Harddisk)信息綁定,在生成license文件時,先要求用戶運行一段實用程序,生成一個hardware的sinature的文件,license generator依據這個文件生成許可文件。
與軟件綁定,比如演示版不允許數據庫超過2G的容量大小(SQL Express規定數據庫大小不能超過4G);只能在規定的時間內運行,通常是一個月,過期后軟件無法啟動;不允許在虛擬機(Virtual Machine)中運行,因為虛擬機的原因,整個系統可以無限制的被Ghost還原;
?
Report Extension
經典的SQL查詢語句的寫法是這樣,可以制作出客戶報表
現在我們換成這樣的查詢數據庫的寫法
2種方式,SQL Procedure和.NET Assembly,可維護性肯定后者強于前者,性能的損失也有.
后者也只有程序員可以維護報表,客戶不可能懂.NET.
但是,面對日益復雜的業務邏輯,多數據庫需求的客戶(有的客戶指定要用Oracle),用.NET Assembly應該是一種趨勢。
?
數據庫管理
一個框架數據庫,驅動多個業務數據庫。
一個業務數據庫可以看成一套帳,可以獨立進行版本管理,功能控制;也可以針對不同的客戶需要,定制(customization)。
如下的注冊公司的界面,Driver Assembly和Driver Type即是注冊客戶定制的程序集,以達到同一個產品,維護多個客戶,不同行業的客戶的使用。
性能(Reflection)的損失是不可避免的,同時也帶來相當可觀的靈活性。
Microsoft的產品也經常Reflection,為什么我們不可以,為一點斤斤計較的Performance?
?
認證authentication,授權authorization 模式(AD/Forms/Windows)
因為我們已經設計出了Application Server,所以,這個地方可以為所欲為,盡情的發揮。
看K3的登陸方式
Activity Directory的方式,是推薦的企業局域網構建方法,AD帶來的PC間相互信任的關系,好處簡直讓人不可忘卻。
Forms方式,可以對用戶名和密碼進行加密,可以記住用戶名和密碼,定期要求用戶修改密碼
Reporting Services的默認登陸方式是Windows,我們需要把它重寫成Forms
很遺憾,即使是Microsoft SQL Server 2008 R2,仍然需要手動修改配置文件,以改成Forms認證。計劃中,要制造一個小工具,來修改Reporting Services的認證方式,手動的配置有些復雜,容易出錯。
再來看集成到ERP中的Report Manager的登陸方式
再來看一下授權,三種權限:功能權限,字段權限,數據權限
功能權限, 基于角色的認證授權 對各子系統的功能模塊的執行權限
先設定用戶組別權限
再到用戶注冊時,設定用戶所屬的組別
可實現ERP系統中60%的權限需求。
字段權限也實現,如上圖,Demo用戶不可以訪問所有的報表,但是可以讀取所有的客戶和供應商信息。
字段權限對某些特殊的字段進行控制,如倉庫人員不可以看到采購員輸入的物料單價,A銷售員,不可以看到B銷售員的客戶的聯系方式,
數據權限,是對具體數據的操作權限。
比如,當采購金額達到10萬時,財務經理Finance Manager不可以直接修改;
于是做出一個數據權限編輯器
如圖中顯示的條件,采購單總金額大于1000000,費用大于5000,而且供應商為Maskey.
這個條件是可以動態增加和刪除,在運行時,由表達式引擎負責解析表達式,傳回表達式執行的結果。
?
異常處理
在業務系統中,異常可實現N層撤消回滾的能力。
為了不暴露具體的產品實現細節,異常的顯示方式,設計如下的異常對話框。
實現方式是注冊當前應用程序域的UnhandledException事件,將異常顯示在自定義對話框中。
AppDomain.CurrentDomain.UnhandledException+= new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
觀察一下Microsoft的產品對異常出錯的提示,Microsoft Report Builder
Microsoft SQL Server
SQL Server出錯窗體的左下方,有三個按鈕,Help,Copy message text, Show technical details
Show technical details會打開一個stack trace的窗體,用于診斷出錯的細節信息。
異常的傳送實現,有二個思路
1. 運用Enterprise Library的Log Application Block,將異常重定向的各種輸出設置中(Console,File,Database)
2. 使用TCP Socket技術,將異常發往指定的服務器,并記錄用戶的操作步驟。因為已經制作出了Application Server,所以,這個地方實現起來也很簡單。至于發送出錯時,當前的操作用戶名稱,stack信息,甚至可以copy screen,把當前出錯的屏幕圖片也一同發送到服務器指定目錄中。
應用框架代碼,將會大量使用.NET Trace機制,將框架的運行狀態輸出
Public class SQLServerTraceListener : TraceListener {
public override void Write(string message)
{
using (SqlConnection conn =
new SqlConnection("server=(local);database=TraceDatabase;Integrated security=true;")) {
using (SqlCommand cmd = conn.CreateCommand()) {
cmd.CommandText = "INSERT INTO Logs(Message) VALUES(@message)";
cmd.Parameters.Add(new SqlParameter("@message", message));
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
}
public override void WriteLine(string message)
{
Write(message);
}
}
這樣讀寫SQL會導致Performance下降,推薦的方式是TCP Socket技術,把異常發送到服務器(Application Server),大量的異常,是不需要處理的,比如,用戶登錄時輸錯密碼,沒有必要大量的寫到服務器的數據庫中。
框架代碼可以識別哪些是關鍵代碼出錯,這些異常則很有必要記錄到持久化介質中以供開發人員診斷。
?
元數據管理
Schema Viewer ERP維護人員最關心的數據表字段,到底存放了一些什么內容,數據間的關系
數據間關系
.NET 屬性代碼
從圖中看到,已經將Table Name放到了Xml注釋的summary中,這樣,充分利用.NET智能感知。
框架數據庫,還有大量的元數據管理:Report, Lookup,Query, Workflow,Form Layout,User/User Group
轉載于:https://www.cnblogs.com/JamesLi2015/archive/2011/06/07/2074242.html
總結
以上是生活随笔為你收集整理的信息化基础建设 开发框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 忘记目标 潜心做事([日] 端河光二)
- 下一篇: 不经保存,直接读取上传文件