DevExpress學習筆記(收藏)

來源:互聯網
上載者:User

DevExpress Persistent Object v.1.5學習筆記(一)

原創:bnPYSse

著名的Delphi第三方控制項開發商DevExpress公司新近公布了其在.NET的新型資料應用工具eXpress Persistent Object v.1.5 for .Net,其發行版本的代號為XPO,是一款專門用於.NET環境下的資料庫應用開發工具。DevExpress的開發能力已為廣大程式員所熟知,正是基於對該公司開發工具的信任,我想此款控制項個頭雖然不是很大,但其開發能力應該是有所保證的。在其應用過程當中,有一些心得,不敢獨享,現整理成文,供大家參考學習。由於水平有限,錯誤之處再所難免,歡迎批評指正並交流。可與我Email聯絡。

eXpress Persistent Objects for .NET為軟體的對象與關聯式資料庫之間提供了一個強大的橋樑作用,可以為開發人員提供相當大的自由度來建立真實的商業對象,而不必去考慮處理如何將其映射到資料表中那些繁複的細節處理。eXpress Persistent Objects for .NET完整地從開發人員角度抽象了資料庫層,讓開發人員可以完全沉浸在物件導向的設計氛圍裡。通過XPO,開發人員建立的應用程式可以很好地工作在各個不同的資料庫系統之下(不久即將支援MSAccess和MSSQL資料庫系統,難道現在不支援嗎?呵呵),而不用更改一點兒代碼。

XPO非常容易上手。如果您看過Microsoft.Visual.Studio.NET.2003所帶的例子Duwamish7,在其中的Common模組當中,一定會被其資料表映射的程式碼片段看個頭暈腦脹,而且覺得微軟的程式員難道會這麼機械嗎?而從其代碼來看,卻又不得不承認,那幫子程式員的確是夠機械的。然而如果有了XPO,你將完全可以從那樣機械的代碼當中解放出來。

開發人員所需要做的僅僅是定義一個持久性的對象類,XPO.NET會自動為其產生資料庫。XPO.NET會透明(在DevExpress公司的介紹當中,Transparently這個詞頻繁地出現,也許正是其強調的一個亮點之處吧)的處理類與對象執行個體之間的關係,不必為靈活性而犧牲其易用性。如果想更多地控制O/R映射關係,可以使用XPO內建的屬性提供的附加映射資訊來滿足任何商業需求。

利用XPO.NET可以從物件模型直接進行資料庫應用程式的開發,不必在表、列、關係及約束等方面花費更多的時間,而把主要的精力放在代碼的編寫上,它使您把主要的精力集中在應用需求等問題上,再也不必要為資料庫的瓶頸等問題而頭疼了。總之,是好處大大、功能強強的,套用一句DevExpress公司的宣傳口號是:

Total Control, Flexibility and Power Bridging the Gap Between the Object World and Relational Databases.

XPO樣本圖
1、eXpress.Persistent.Object.v.1.5的新特性
  • 映射已存在的資料庫。XPBaseObject做為基類可為持久性對象提供服務。
  • 支援MSSQL7.0(^_^,這也算一個新特性?呵呵)。
  • 頁面級收集器。PageSelector類允許對一個源容器進行頁面管理。
  • 設計期的頁面管理。XPPageSelector組件允許在設計時段指定一個頁面容器做為資料來源,並綁定到使用者介面。
  • 容器內容過濾。XPCollection.Filter屬性允許過濾出已存在的容器內容,並可擷取匹配過濾標準的子容器項目。
  • 容器內容排序和過濾。非持久性屬性可用於過濾和排序XPCollection容器的內容。
  • 排序與過濾選項。XPCollection.CaseSensitive屬性可控制容器成員的大小寫。
  • 新的標準運算。AggregateOperand允許通過Aggregate.Sum,Aggregate.Count,Aggregate.Min和Aggregate.Max操作選項進行運算。
  • 支援值對象
  • 值與類型轉換。藉助於ValueConverter和ValueConverterAttribute類可以實現資料庫值與持久性屬性之間的雙向轉換。
  • 資料庫檢視的映射。持久性對象現可以映射到資料庫檢視。
  • 持久性空值。空值可通過NullValueAttribute被儲存在資料庫中。
  • 自訂資料庫類型。利用持久性屬性或欄位對應,利用DbTypeAttribute可明確標識出列的類型。
  • 跟蹤容器內容的更改。可通過CollectionChanged事件跟蹤容器內容的更改。
  • 效能的提高。當對象被載入時,ExplicitLoadingAttribute要協助最佳化資料庫查詢效能。
  • XPBaseObject。XPBaseObject現可支援IEditableObject。可通過此介面控制對象的改變。
  • XPBaseObject。XPBaseObject現擁有一個虛擬AfterConstruction方法允許實現邏輯建立自主對象。
  • XPCollection。XPCollection擴充CollectionChanged事件,提供在容器操作過程中執行自訂動作。
2、XPO如何工作

物件導向的應用程式設計與開發為當前的複雜應用開發提供了一個高效能與多產的手段,提高了代碼重用的機會,以及當終端使用者需求發生變化時更高的靈活性。

當建立一個資料庫應用時,開發人員看起來總是被迫與資料表、視圖、資料欄位對象打交道,而不是直接處理商業對象。這種關聯式資料庫對象領域的差距現象類似於ADO.NET和特定領域內的商業對象的差別,對開發人員來講,同樣是一極大的挑戰。

Visual Studio .NET試圖通過型別安全資料集來解決這個問題:一個開發人員可以拾取一個資料表並且產生一個型別安全的資料集類,使該類看上去更類似於一個事務域中的商業對象,這種機制被用於實現持久性商業對象,儘管看來此類對象更像是面向資料的一個結構。

那麼有沒有一種方法可以映射你設計良好的商業物件模型到關聯式資料庫而不必處理資料表與欄位呢?也許您已經猜到這個答案了。通過XPO就要以實現這樣的工作。XPO從另外一個不同的角度試圖來解決這個問題——通過對商業對象世界的透視。

來看一個小例子。在一個銷售管理應用程式中,一個連絡人的類是如下來表示的:

 
public class Contact {                        public string FirstName;                        public string LastName;                        public string PhoneNumber;                        public string Email;                        }

很顯然,在銷售管理應用系統當中所有的連絡人都應該儲存在資料庫中,因此Contact必然是一個持久化對象。要想將其持久化,其實非常之簡單,所需要做的只是將其從XPObject中進行繼承:

 
using DevExpress.Xpo;                        ...                        public class Contact: XPObject {                           public string FirstName;                        public string LastName;                        public string PhoneNumber;                        public string Email;                        }                        

一般在使用持久化對象之前,都要指定一個聯結字串串連到資料庫,類似下面的代碼:

 
...                        Session.DefaultSession.ConnectionString="...";                        Contact contact = new Contact();                        contact.FirstName = "John";                        contact.LastName =  "Doe";                        contact.Email = "jdoe@johndoe.com";                        contact.Save();                        ...                        

通過以上如此簡單的代碼,就在.NET環境中建立了一個Contact表,並且插入一個記錄到裡面。

那麼如何從資料庫中取用該對象呢?XPO.NET提供了提供了XPCollection來取用對象:

 
XPCollection contacts = new XPCollection(typeof(Contact));                        foreach(Contact contact in contacts) {                        Console.WriteLine(contact.Email);                        }

比較幸運的是,XPCollection可以作為DataGrid的資料來源用以在DataGrid當中顯示Contect列表:

 
contactDataGrid.DataSource = contacts;                        

如果想更改顯示對象在DataGrid中的顯示項目,可以對Contact.DisplayableProperties進行設定:

 
contacts.DisplayableProperties = "FirstName;LastName;Email";

大多數時候,並不需要從資料庫中取用全部的Contact對象,而實際情況往往是按照一定的標準尋找部分對象,資料庫管理系統往往提供SQL查詢來完成這類任務,完全可以用來代替foreach疊代:

 
XPCollection jdoe = new XPCollection(typeof(Contact),                        new GroupOperator(GroupOperatorType.And,                        new BinaryOperator("FirstName", "John"),                        new BinaryOperator("LastName", "Doe")));

以上代碼即尋找"John Doe"對象,類似於資料庫中的SQL查詢語句。

預設情況下,容器中的對象是無序的,以下代碼即取用FirstName="John"並且LastName按照升序進行排序。

 
XPCollection jdoe = new XPCollection(typeof(Contact),                        new BinaryOperator("FirstName", "John"),                        new SortProperty("LastName", SortingDirection.Ascending);

在絕大部分的商業模型中,資料表都不是獨立存在的,表與表之間大都存在著這樣那樣的關係,比如,連絡人往往屬於某一間公司:

 
using DevExpress.Xpo;                        ...                          public class Company : XPObject {                        public string Name;                        public string PhoneNumber;                        public string WebSite;                        }                        public class Contact : XPObject {                        public string FirstName;                        public string LastName;                        public string PhoneNumber;                        public string Email;                        public Company Employer;                        }

在資料表存在關係的情況下,XPO.NET會知道Employer屬性是另外一個商業對象的引用,因而會在資料庫結構中自動地維護這種關係的存在,而勿需任何手工代碼來實現。

如果一個商業對象擁有子物件,比如,一個Order訂單一般情況下會有若干個訂單細項,這時需要給XPO.NET一個小小的“提示”,告訴它子物件將會被儲存在容器當中:

 
using DevExpress.Xpo;                        ...                        public class OrderLine : XPObject {                        public string Description;                        public double Price;                        public int Quantity;                        [Association("OrderLines")]                        public Order Order;                        }                        public class Order : XPObject {                        public string OrderNo;                        public string Description;                        [Aggregated]                        [Association("OrderLines")]                         public XPCollection OrderLines {                        get { return GetCollection("OrderLines"); }                        }                        }

物件變數允許我們在程式當中進行引用,但是在程式程式運行過程中它並非是唯一存在的,因而需要在程式運行過程當中用一個唯一指示符標識出該對象來。在每一個持久性對象當中都有一個OID屬性,OID標識某個指定類的唯一識別碼:

 
Contact contact = (Contact)Session.DefaultSession.GetObjectByKey(typeof(Contact), storedOID);

通過以上的例子可以看出XPO.NET商業模型與資料表之間的透明轉換,即現在開發領域討論的比較熱烈的Object-Relational Mapping,大大提高了商業的重用性和靈活性,實現了物件導向的資料庫編程。在功能與Borland公司提出的ECO(Enterprise Core Object)模型非常類似,當然XPO.NET的對於資料庫的串連日前只實現了SQL和Access的MDB,沒辦法與ECO的強大所比擬,但是使用VS.NET環境編程的朋友們,如果沒辦法享受C# Builder(Delphi8.NET)所提供的ECO強大魅力的情況下,使用XPO.NET是當前比較理想的選擇,將編程人員的重複復雜的O\R映像關係工作中解放出來,將更我的心思應用到商業模型的實現當中。

個人認為,目前Visual.Studio.NET+Together(for .NET)+XPO.NET將是比較理想的選擇。

外語水平以及理解能力有限,不當之處,請諸位多多批評指教。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.