Minggu lepas first time aku bagi training untuk company luar dan training tersebut di kelolakan oleh pihak Syarikat aku berkerja, maka aku tak perlu bercuti unutk buat consultation training. 6 orang developer datang selama 4 hari dari sebuah company. Tajuk yang aku pilih untuk train dia orang ialah Building Enterprise Application using NHiberante & Domain Driven Design.
Kebanyakkan masa dalam training menjurus kepada hands on training. Hari pertama banyak aku sentuh tentang teori/konsep ORM/NHibernate. Aku juga bawa contoh penggunaan TDD dalam development dan aku buat example tanpa prepare so nak tunjukkan serba sedikit cara real start project from scratch. So bila run TDD tu nampak lah kebaikan sebab bila buat impromptu nampak lah apa yang aku expect code tak menghasilkannya kerana ada silap dalam code base tersebut.
Nanti aku tulis lagi, dah masa bulan malas nak update...
Friday, July 31, 2009
NHibernate - Training
Labels: NHibernate, Training
Posted by ryzam at 11:33 AM 0 comments
Friday, May 22, 2009
NHibernate: Satu analisis perkembangan di Malaysia

Hibernate ialah Object Relational Mapper dimana project ini dimulakan oleh community Java lebih dari 6 tahun yang lepas. Sekarang ini Hibernate dibawah kelolaan JBoss group, kedua-dua pengasas awal mereka bekerja dengan JBoss sekrang ini.NHibernate pula ialah versi Hibernate yang di tulis semula dan dipadankan dengan teknologi .Net Framework (Microsoft). NHibernate core development sudah menjangkau usia 5 tahun bermula dari tahun 2004 dan sepanjang itu telah keluar banyak versi kepada pengguna. Latest versi ialah NHibernate 2.1 dan keupayaan NHibernate versi ini hampir sama dengan Hibernate 3.0
Penerimaan konsep ORM dalam Java community lebih ketara berbanding didalam community .Net. Ini berdasarkan community Java telah lebih lama terlibat dan bermula dengan project-project sebegini. Project open source dalam Java community lebih ketara, cuma selepas beberapa tindakan dari community .Net yang ingin melihat perkembangan sihat dalam .Net software development dan dengan penglibatan Microsoft sendiri yang sekarang ini sudah mula boleh menerima open source sebagai cara baru memperlihatkan cara tindakan, cara berfikir yang berlainan dari kebiasaan yang diamalkan oleh developer-developer yang mendapat didikan terus dari amalan software development Microsoft. Pattern & Practice Microsoft sebelum ini, selalu dikritik oleh lead-lead developer yang memcabar bahawa cara tersebut tidak berapa sesuai dalam perkembangan software untuk enterprise era.
Tertubuhnya community yang menggelarkan diri mereka sebagai ALT.Net ialah sebagai interpretasi mereka untuk memperkenalkan cara yang lebih bagus dari segi design, penggunaan tools, corak berfikir dalam ruang yang lebih bebas dan pengawalan life cycle software itu sendiri. NHibernate sendiri lebih mendapat tempat dalam community ini berbanding dengan Entity Framework atau Linq to SQL. Sudah semestinya mereka-mereka ini mempunyai pendapat kenapa mereka menolak product ORM Entity Framework yang diperkenalkan oleh Microsoft. sebab itu ialah EntityFramework tidak support POCO dan persistence ignorance. POCO ialah Plain Old CLR Object, iaitu simple basic class yang mengandungi setter/getter dan behavior. EntityFramework sebelum version 4.0 penggunaan entity perlulah di extend kepada persistence class dan di sinilah timbulnya masalah besar apabila hendak melakukan unit test.
Perkembangan NHibernate di Malaysia sendiri cukup perlahan dan pada aku ini adalah kerana maklumat yang ada pada software developer dalam community .Net di Malaysia lebih tertumpu kepada core cara yang diperkenalkan oleh Microsoft. Mircosoft Malaysia sendiri dibawah department consulting services (Aku pernah berkerja sebagai contract developer 8 bulan) tiada pengetahuan tentang NHibernate dan seminar, training tiada langsung menyentuh tentang NHibernate. Forum-forum lain juga kurang bercerita tentang NHibernate apatah lagi bercerita tentang Unit Test, Domain Design dan Agile. Forum disini lebih terarah kepada basic programming atau "Getting Started". Aku tidak menafikan kepentingan forum yang membincangankan maklumat tersebut, tapi pada aku developer di Malaysia sendiri perlulah membuka mata dengan lebih luas dan mencari cara yang lebih efficien dalam software development. Aku tujukan pada developer yang menjadikan Microsoft sebagi platform. Developer dari community lain aku percaya mereka jika bercerita tentang software development lebih advance dari segi framework, cara dan lotaran kotak pemikiran mereka.
Ada beberapa company di Malaysia yang telah pun menggunakan NHibernate didalam production code mereka, sebagai contoh Security Commision (SC), POS Malaysia,TMNet, Al-Madinah International University, IIUM (Research & Management). Company software development yang lain ada beberapa tapi project yang mereka handle aku tak berapa pasti. Hibernate mungkin lebih lagi wallahu'alam, mungkin member java boleh update.
Aku berhasrat agar banyak lagi software company di Malaysia yang akan menggunakan NHibernate sebagai ORM mereka. Sebagai permulaan aku cuba menulis NHibernate Siri dalam usaha aku hendak memperkenalkan NHibernate, dan insyAllah kalau ada masa dan jika ada yang berminat aku rancang hendak adakan NHibernate training. Aku ada terfikir hendak berbincang dengan pihak management company aku untuk buat NHibernate Short Course tapi masih tersimpan dalam hati sahaja.
Labels: NHibernate, ORM
Posted by ryzam at 9:34 AM 5 comments
Wednesday, May 13, 2009
NHibernate Siri: Asas - Part 1 of N
Artikel aku yang lepas tentang NHibernate hanya menyentuh sedikit tentang NHibernate secara umum. Aku fokuskan kepada bagaimana hendak mula develop simple app dengan NHibernate.
Kali ini aku nak masuk detail kepada asas NHibernate, tapi aku plan tak nak sentuh teori tentang ORM atau teori NHibernate itu sendiri. Aku nak start direct asas kepada NHibernate technical.
Secara dasarnya element penting dalam NHibernate ialah Domain object, Domain Mapping dan juga Session.
Untuk mula aku akan cadangkan project structure yang aku akan buat ialah seperti ini
Domain Object
Domain object ialah normal class yang ada property (set,get) dan method. Disini letaknya business behaviour dan terpulang pada kita nak design domain object itu bentuknya bagaimana. Ia boleh menjadi complex atau menjadi simple mengikut context yang didefine semasa process sesi modeling. Untuk tutorial ini, aku akan define simple business object iaitu Product. Product class akan di create di dalam NS.Domain.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NS.Domain
{
public class Product
{
public string Name { set; get; }
public string Description { set; get; }
public decimal Price { set; get; }
}
}
Selepas create domain class ini, next ialah mapping domain object ini untuk persistence ke dalam database. NHibernate akan gunakan mapping ini sebagai panduan untuk berinteraksi dengan persistence medium (Database).
Domain Mapping
Untuk mapping domain object ada beberapa cara untuk melakukannya, pada kebiasaan ialah dengan create xml file Product.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="FirstSolution" namespace="FirstSolution.Domain">
<class name="Product">
<id name="Id">
<generator class="guid" />
</id>
<property name="Name" />
<property name="Description" />
<property name="Price" />
</class>
</hibernate-mapping>
Ok, kali ini aku tidak akan menggunakan xml kerana agak susah untuk write markup sebaliknya aku akan guna fluent mapping dalam project FluentNHibernate. Sebelum itu ada satu lagi cara untuk mapping ialah menggunakan property attribute
[Class]
public class AACatalog
{
[Property]
public virtual string Version { get; set; }
[ManyToOne(Name = "Batery", Lazy = Laziness.Proxy, Cascade = CascadeStyle.None, OuterJoin=OuterJoinStrategy.False)]
public virtual Batery Batery { set; get; }
[Bag(Name = "BateryCatalogs", Lazy = true, Generic = true, Inverse = true, Cascade = CascadeStyle.AllDeleteOrphan)]
[Key(1, Column = "AAId")]
[OneToMany(2, Class = "BateryCatalogs", ClassType = typeof(BateryCatalogs))]
public virtual IList<BateryCatalog> BateryCatalogs
{
set;
get;
}
}
Untuk domain class Product aku akan create ProductMap didalam NS.Domain dan aku letak didalam folder Mapping seperti ini. Pastikan juga letakkan reference FluentNhibernate.dll di reference project tree.Class ProductMap ialah seperti dibawah. Ada sedikit penambahan di class Product dimana aku tambah property untuk Id, secara umum unutk mapping pada persistence class yang simple kita banyak boleh gunakan default attribute pada nhibernate mapping, dimana nhibernate engine akan "infer" colum name, colum type etc. Sebagai conoth jika kita tak define nama colum nhibernate mapping akan ambil property name sebagai nama column
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentNHibernate.AutoMap;
namespace NS.Domain.Mapping
{
public class ProductMap : AutoMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.Price).CustomSqlTypeIs("decimal");
}
}
}
Ok selesai dengan mapping domain class, langkah seterusnya ialah untuk test business domain dengan run configuration dan table schema.Class dibawah ialah helper class yang akan digunakan didalam test.
public class NHibernateInMemoryConfiguration
{
protected static string DbFile = "db";
protected static ISessionFactory sf = null;
protected static Configuration config = null;
public static void InitializeConfiguration(string assemblyName)
{
sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
//.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")
.ShowSql())
.Mappings(m => m
.FluentMappings
.AddFromAssembly(Assembly.Load(assemblyName)))
.ExposeConfiguration(SetConfiguration)
.BuildSessionFactory();
}
public static void SetConfiguration(Configuration cfg)
{
config = cfg;
}
public void CreateSchema()
{
if (File.Exists(DbFile))
File.Delete(DbFile);
new SchemaExport(config).Create(true, true);
}
}
Ok selesai dengan class ini, masa unutk run test.Aku akan buat 2 class satu ialah base class iaitu RepositoryBaseTest.cs dan ProductTest.cs
public class RepositoryBaseTest : NHibernateInMemoryConfiguration
{
protected ISession session;
[TestFixtureSetUp]
public void ConfigurationInitialization()
{
InitializeConfiguration("NS.Domain");
}
[SetUp]
public void Setup()
{
this.CreateSchema();
}
}
[TestFixture]
public class ProductTest:RepositoryBaseTest
{
[Test]
public void Should_save_Product()
{
using(var s = sf.OpenSession())
using(var tx = s.BeginTransaction())
{
Product p = new Product { Name = "A", Description = "B", Price = Convert.ToDecimal("10.0") };
s.Save(p);
tx.Commit();
}
}
}
Labels: NHibernate
Posted by ryzam at 12:23 AM 0 comments
Saturday, May 02, 2009
NHibernate Siri: Macam mana nak start
Aku dah beberapa kali nak tulis tentang Nibernate tapi selalu je tak habis siri tu. Dan kebanyakkan pengunjung yang datang direct dari google search masuk di sini adalah berkaitan NHibernate. Sebenarnya aku kena tulis supaya aku lebih faham dan tak lupa part basic dan untuk kemudian hari senang untuk tengok balik basic tentang NHibernate nie.
Ok untuk bermula basic sekali ialah kena install NHibernate samaada download yang binary atau dari source file dan kemudian compile semula. Aku rasa untuk yang simple download je yang binary.
1. Download NHibernate binary distribution
NHibernate
2. Download NUnit
NUnit
3. Download FluentNHibernate
FluentNHibernate
Ok ready
Install kesemua component/libarary tersebut. Aku akan guna SQL Lite untuk testing persistence object. So tak perlu susah-susah nak setup database SQL Server etc. 3 perkara penting bila test persistence object ialah check save/update atau tidak dalam database, query return seperti dikehendaki dan cascade bila delete.
Ok jika semua dah install ready untuk coding. Open Visual Studio atau Express Edition dan create InMemoryPersistenceTest.cs
public class InMemoryPersistenceTest
{
public ISessionFactory sf = null;
private const string DbFile = "firstProgram.db";
public InMemoryPersistenceTest(string assemblyName)
{
sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile(DbFile)
.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")
.ShowSql()
)
.Mappings(m => m
.FluentMappings
.AddFromAssembly(Assembly.Load(assemblyName)))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
public void BuildSchema(Configuration cfg)
{
if (File.Exists(DbFile))
File.Delete(DbFile);
new SchemaExport(cfg)
.Create(true, true);
}
}
Aku guna FluentNHibernate untuk setting NHibernate configuration. Next step aku create file Person.cs
namespace NHibernateSeries1.Domain
{
public class Person
{
public virtual Guid Id { set; get; }
public virtual string Name { set; get; }
}
public class PersonMap : AutoMap<Person>
{
public PersonMap()
{
WithTable("Person");
Id(x => x.Id).GeneratedBy.Guid();
Map(x => x.Name);
}
}
}
Ok bila dah create domain untuk Person,perlu ada mapping, aku guna facility yang ditawarkan dalam FluentNhibernate untuk buat AutoMap. Masa untuk lakukan testing.
namespace NHibernateSeries1
{
[TestFixture]
public class PersonTest:BaseTest
{
Guid personId;
[Test]
public void SavePerson()
{
using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
Person p = new Person { Name = "Azam" };
s.Save(p);
personId = p.Id;
tx.Commit();
s.Close();
}
using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
var p = s.Get<Person>(personId);
Assert.AreEqual("Azam",p.Name);
tx.Commit();
}
}
}
}
Alhamdulillah cukup mudah tanpa setup database pun. Bila run insyAllah dapatlah warna PAS (hijau) ertinya berjaya hehehe
Labels: NHibernate
Posted by ryzam at 1:33 AM 0 comments