NHibernate3剖析:Mapping篇之ConfORM實戰(1):概覽

來源:互聯網
上載者:User

標籤:

ORuM思想浮出

對於ORM(Object Relational Mapping)我們太熟悉了,但是我們從另一個角度可以想象出ORuM(Object Relational un-Mapping)的思想理念。我們在程式中僅僅定義Domain, 而想有個工具可以協助我們"自動化"實現Mapping,我們無需按傳統的ORM思想那樣為Domain手動編碼Mapping。

ORuM對於使用者來說更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-Relational Intelligent-Mapping)的意思。

有沒有這樣的實現呢?答案是相當肯定的。

ConfORM概述

ConfORM是NHibernate貢獻者Fabio Maulo大牛設計的,是一個配置ORM的工具,其介面按照ORM思想定義,基於GNU Lesser General Public License協議。其設計思想來源就是 ORuM(Object Relational un-Mapping)。它按照Domain定義協助我們"自動"實現Mapping。現在僅僅實現了對NHibernate的"自動"Mapping,如果有興趣的話,可以添加對EF實現自動Mapping功能。

那麼ConfORM到底如何"自動"的呢?

NHibernate對Mapping的處理過程,就是將XML檔案還原序列化為HbmMapping類,再將HbmMapping類Bind為Mappings,最後Bind SessionFactory。而ConfORM就是利用Domain定 義實現自動產生HbmMapping類,完全避免了編寫XML檔案和還原序列化。這樣的話,ConfORM正是起到了ORAWM“object to relational adapter without mappings"的作用。

你可以到http://code.google.com/p/codeconform/ 擷取ConfORM

ConfORM初試

這是這個系列的第一篇,我們用一個簡單的例子實現一下吧,以後慢慢介紹其細節。首先我們寫下NHibernate基礎代碼和通用代碼,這一步的代碼在將來的文章中也經常使用,以後就不單獨貼出來了。

//Code Snippets Copyright http://lyj.cnblogs.com/public static class NhConfig{    private const string ConnectionString =        @"Data Source=.\SQLEXPRESS;Initial Catalog=NHTest;Integrated Security=True;Pooling=False";    public static Configuration ConfigureNHibernate()    {        var configure = new Configuration();        configure.SessionFactoryName("Demo");        configure.Proxy(p => p.ProxyFactoryFactory<ProxyFactoryFactory>());        configure.DataBaseIntegration(db =>                                          {                                              db.Dialect<MsSql2008Dialect>();                                              db.Driver<SqlClientDriver>();                                              db.ConnectionString = ConnectionString;                                              db.LogSqlInConsole = true;//用於顯示輸出SQL                                          });        return configure;    }    public static string Serialize(HbmMapping hbmElement)    {        var setting = new XmlWriterSettings { Indent = true };        var serializer = new XmlSerializer(typeof(HbmMapping));        using (var memStream = new MemoryStream(2048))        using (var xmlWriter = XmlWriter.Create(memStream, setting))        {            serializer.Serialize(xmlWriter, hbmElement);            memStream.Flush();            memStream.Position = 0;            var sr = new StreamReader(memStream);            return sr.ReadToEnd();        }    }}

ConfigureNHibernate()方法用於配置NHibernate,Serialize方法用於輸出。我們開始ConfORM之旅吧:

1.定義一Domain

開始之旅,我們總是從最簡單的入手,將來慢慢學習ConfORM到底如何"自動"為我們複雜的Domain結構產生出Mapping的。

//Code Snippets Copyright http://lyj.cnblogs.com/public class Domain{    public virtual int Id { get; set; }    public virtual string Name { get; set; }}
2.ConfORM配置

這一步非常重要,是ConfORM的核心所在,執行個體化一個ObjectRelationalMapper對象,裝配Domain對象,執行個體化Mapper對象,調用Mapper對象的CompileMappingFor()方法自動產生HbmMapping。

//Code Snippets Copyright http://lyj.cnblogs.com/public static HbmMapping GetMapping(){    var orm = new ObjectRelationalMapper();    orm.TablePerClass<Domain>();    var mapper = new Mapper(orm);    return mapper.CompileMappingFor(new[] { typeof(Domain) });}
3.ConfORM之旅

這一步關鍵環節是調用Configuration對象的AddDeserializedMapping()方法添加HbmMapping和配置中繼資料。

//Code Snippets Copyright http://lyj.cnblogs.com/public static void JustForConfOrm(){    //配置NHibernate    var conf = NhConfig.ConfigureNHibernate();    //在Configuration中添加HbmMapping    conf.AddDeserializedMapping(GetMapping(), "Domain");    //配置中繼資料    SchemaMetadataUpdater.QuoteTableAndColumns(conf);    //建立資料庫結構描述    new SchemaExport(conf).Create(false, true);    //建立SessionFactory    var factory = conf.BuildSessionFactory();    //開啟Session做持久化資料    using (var s = factory.OpenSession())    {        using (var tx = s.BeginTransaction())        {            var domain = new Domain {Name = "我的測試"};            s.Save(domain);            tx.Commit();        }    }    //開啟Session做刪除資料    using (var s = factory.OpenSession())    {        using (var tx = s.BeginTransaction())        {            s.CreateQuery("delete from Domain").ExecuteUpdate();            tx.Commit();        }    }    //刪除資料庫結構描述    new SchemaExport(conf).Drop(false, true);}
4.輸出XML

好了,做了上面3步就完成了我們的測試:NHibernate自動建立資料庫結構描述、持久化資料、刪除資料、最後把資料庫結構描述刪除。這時大家都有一個疑問,ConfORM自動產生的HbmMapping是什麼啊? 序列化HbmMapping對象到底輸出什嗎?為了滿足大家的需求我們寫段代碼讓ConfORM列印出XML,對照我們以往手寫的*.hbm.xml檔案看看是否符合:

//Code Snippets Copyright http://lyj.cnblogs.com/public static void ShowXmlMapping(){    var document = NhConfig.Serialize(GetMapping());    File.WriteAllText("MyMapping.hbm.xml", document);    Console.Write(document);}

這時,我們開啟輸出目錄的MyMapping.hbm.xml檔案看看內容:

//Code Snippets Copyright http://lyj.cnblogs.com/<?xml version="1.0" encoding="utf-8"?><hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"                   namespace="YJingLee.ConfOrm" assembly="YJingLee.ConfOrm"                   xmlns="urn:nhibernate-mapping-2.2">  <class name="Domain">    <id name="Id" type="Int32">      <generator class="hilo" />    </id>    <property name="Name" />  </class></hibernate-mapping>

恩,是手寫的完全一樣,ConfORM可以意識到Domain類的成員,Id為主鍵使用了hilo建置原則,Name為屬性。咦,難道只會這樣產生?答案當然不是,ConfORM提供了很多模式和定製化,這方面在以後一一介紹。

僅僅使用了第二步的那幾行代碼就完成了自動對應的功能,是不是很酷,看過這篇文章後,你是不是非常急切的想跟著我學習下ConfORM,然後試著重構自己的老程式,拋掉hibernate.cfg.xml和*.hbm.xml檔案了啊。

結語

這篇文章先帶著大家走進ConfORM,其細節接下來慢慢介紹,大家有什麼問題和思考可以回複。

附上源碼下載:YJingLee.TryConfOrm.zip (VS2010項目)

著作權聲明:本文為博主http://www.zuiniusn.com原創文章,未經博主允許不得轉載。

NHibernate3剖析:Mapping篇之ConfORM實戰(1):概覽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.