Archive

Archive for May, 2011

Fluent NHibernate – to make your life a hell of a lot easier.

Fluent NHibernate นั้นเป็นเครื่องมือ ที่พัฒนา เพิ่มเติมมาจาก NHibernate   มาตรฐาน ซึ่งเดิมนั้น การทำการ Mapping จะเขียนด้วย XML     การพัฒนาของ Fluent NHibernate นั้น ทำให้เราสามารถ mapping ด้วยการเขียน C# code แทนที่จะเป็นการสร้าง XML documents(.hbm.xml files)

นอกจากนี้  Fluent NHibernate ยังมีเครื่องมือ อื่น ๆ ที่น่าสนใจ เช่น

  • Auto mappings – การ mapping ทำให้อัตโนมัติ โดยอ้างอิงจาก entities ที่ออกแบบและเขียนไว้
  • Presistence specification testing –  การ testing  สำหรับ entities ที่ออกแบบไว้  โดยไม่จำเป็นต้องเขียน CRUD แม้แต่บรรทัดเดียว
  • Full application configuration การกำหนด configuration ทำผ่านทาง Fluent configuration API ได้เลย
  • Database configuration – เช่นเดียว กันสามารถกำหนด configuration ของ Database ผ่าน ทาง API ได้เลย

ความเป็นมาของ Fluent NHibernate

NHibernate เป็น Object Relational Mapping framework ใช้สำหรับการจับคู่ ระหว่าง relational data และ objects   ซึ่ง NHibernate มีการกำหนด การ จับคู่ หรือ mapping ในรูปแบบ XML เรียกว่า HBM ดังนั้น class ทุก class จะต้องมี HBM XML file กำกับอยู่ด้วยเสมอ เพื่อที่จะป็นตัวกำกับ และเป็นตัวอธิบาย โครงสร้างของข้อมูล ในฐานข้อมูล ให้กับ class นั้น ๆ   ครับ  ก็ mapping file นี่แหละครับ ที่ Fluent NHibernate สร้างเครื่องมือมาแทนที่

พอเข้าใจนะครับ ผมรู้ว่าคนที่อ่าน บทความนี้น่าจะต้อง เข้าใจ ORM เป็นพื้นอยู่แล้วนะครับ

แต่ทำไมหล่ะครับ เหตุใดถึงต้องมีการสร้างเครื่องมือมาแทนที่ ในขณะที่ การแยก code ออกจาก XML นั้นเป็นวิธีการที่ดีอยู่แล้ว  คำตอบก็คือ มันดีก็จริงแต่มันก็นำไปสู่เหตุการณ์ที่ไม่พึงประสงค์มากมาย เช่น

  •  Compiler ไม่ได้ทำการ evaluate XML ให้  เมื่อมีการเปลี่ยนชื่อ properties ใน class แล้วไม่ได้ทำการ ปรับปรุง ใน mapping เราจะไม่รู้เลยจนกว่า mapping จะถูกอ่าน ตอน runtime
  • XML นั้น หยุมหยิม ครับ ถึงแม้ว่า NHibernate นั้นลด การใช้งาน XML elements ไปแล้ว แต่ก็ยังหนีไม่พ้น ครับ
  • Repetitive mapping  – NHibernate HBM mapping จะยิ่ง เยอะ หากเราต้องเขียนข้อกำหนด เดิม ๆ บ่อยครั้ง เช่น  ข้อกำหนดที่จะไม่ยอมให้ ข้อมูลแบบ string ให้รับค่า null และต้องมีความยาวไม่เกินกว่า 1000 ตัวอักษรเป็นต้น

แล้ว Fluent NHibernate จัดการกับ ข้อปัญหาเหล่านี้ได้อย่างไร

ครับ มันทำได้ด้วยการ เปลี่ยนการเปขียน mapping ให้มาเป็นการ code แทน  และถูก compile ไปกับ app ที่เราเขียน ทำให้เมื่อเราแก้ไขหรือเปลี่ยนแปลง class ก็จะทำให้ ไปแก้ไข การ mapping ตามที่ควรจะเป็น ด้วย  สำหรับเรื่องการใช้งานซ้ำ ๆ    Fluent NHibernate มี configuration system   ทำให้เราสามารถกำหนด รูปแบบสำหรับการทำ override ได้  และ อื่น ๆ

ตัวอย่าง ครับ <สำหรับข้อมูลและตัวอย่างนำมาจาก  http://wiki.fluentnhibernate.org/Getting_started >

วิธีการ mapping แบบ เดิม

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QuickStart" assembly="QuickStart">

<class name="Cat" table="Cat">
  <id name="Id">
    <generator />
  </id>
  <property name="Name">
    <column name="Name" length="16" not-null="true" />
  </property>
  <property name="Sex" />
  <many-to-one name="Mate" />
  <bag name="Kittens">
    <key column="mother_id" />
    <one-to-many class="Cat" />
   </bag>
</class>
</hibernate-mapping>

วิธีการ mapping แบบ Fluent NHibernate

public class CatMap : ClassMap<Cat>
{
  public CatMap()
  {
    Id(x => x.Id);
    Map(x => x.Name)
      .Length(16)
      .Not.Nullable();
    Map(x => x.Sex);
    References(x => x.Mate);
    HasMany(x => x.Kittens);
  }
}

จบไว้แค่นี้ก่อนนะครับ ไว้ต่อ กันในรายละเอียดต่อไป ครับ s_teerapong2000@yahoo.com

Categories: C# .NET