‫آیا NHibernate انتخاب خوبی به عنوان یک ORM است؟

اگر در مورد لزوم استفاده از ORM به جواب مثبت رسیده‌اید، انتخاب یک ORM کار چندان  سختی نیست. در حال حاضر ORMهای تجاری و غیر تجاری زیادی وجود دارند از جمله ADO.NET Entity Framework، LLBLGen Pro، SubSonic و… برای دیدن فهرست آنها می‌توانید به این لینک مراجعه کنید.

NHibernate یک ORM کد باز است که از دنیای جاوا وارد دات‌نت شده است. کد باز بودن آن خود به خود مزایای زیادی ایجاد می‌کند. از جمله: جامعه استفاده کنندگان بیشتر، تنوع محصولات جانبی، عدم نیاز به کرک و قفل‌شکنی، عدم وابستگی به ‎.Net Framework و…

از آنجا که NHibernate بر اساس پروژه‌ی جاوایی Hibernate ایجاد شده از تمام تکنیک‌ها و منابع آموزشی آن می‌توان در NHibernate نیز استفاده کرد. NHibernate مدت‌هاست که چه در جاوا و چه در دات‌نت مورد استفاده است و منابع، نمونه کدها و پروژه‌های زیادی بر اساس آن به وجود آمده.

در مورد NHibernate پروژه‌های جانبی زیادی وجود دارد که کار کردن با آن را خیلی راحت‌تر ساخته است. مثلاً Fluent NHibernate به عنوان ابزاری که با کمک آن دیگر نیازی به استفاده از Xml Mappingهای NHibernate یعنی HBMها وجود ندارد. NHibernate Profiler ابزاری برای بازرسی و افزایش سرعت NHibernate. پروژه‌ی Castle ActiveRecord به عنوان ابزار راحت‌کننده‌ی کار با NHibernate و چندین پروژه‌ی مفید دیگر.

یکی از نگرانی‌های همیشگی در کار با ORMها Performance است. مسلماً هر ORMی مقدار کمی سرعت را کاهش می‌دهد. چون ORM یک لایه‌ی اضافی بر روی ADO.NET است. اما این موضوع در برابر دیگر مزایایی که استفاده از ORM به دست می‌دهد قابل اغماض است. البته این کاهش سرعت عمدتاً به علت عدم تنظیم صحیح ORM یا طراحی غلط Class Diagram است و می‌توان آن را تا اندازه‌ی زیادی از بین برد.

در این مورد که آیا NHibernate را می‌توان در پروژه‌های بزرگ به کار برد یا نه فکر نمی‌کنم در مورد پروژه‌هایی که داخل کشور به کار می‌روند مشکل خاصی ایجاد کند. تصور من این است که NHibernate خودش یک چیزی مثل ADO.NET است و می‌تواند بدون توجه به بزرگی یا کوچکی پروژه، یک Performance قابل قبول را از خودش به نمایش بگذارد.

ما در شرکت قبلی استفاده‌های خیلی خوبی از NHibernate کرده و از خیلی از مزایای آن بهره برده بودیم. اما متاسفانه در مقوله‌ی Performance مشکلاتی داشتیم که باز هم  عمدتاً مربوط به عدم استفاده صحیح ما از NHibernate بود. مطمئنم که با استفاده مناسب‌تر و داشتن دانش فنی عمیق‌تر از NHibernate می‌توانستیم مشکل Performance را هم از سر راه برداریم. با این وجود توصیه‌ام به کسانی که قصد استفاده از NHibernate را دارند این است که قبل از شروع حسابی مستندات آن را مطالعه کنند و یکی دو نمونه هم با آن بسازند. ضمناً در مورد طراحی Class Diagramهای دیتابیسی نهایت دقت را به عمل آورند در غیر این صورت حسابی به دردسر خواهند افتاد.

یکی از مشکلات موجود با NHibernate، راه‌اندازی اولیه آن است. منظور از راه‌اندازی اولیه، نوشتن Data Access Layer برنامه با استفاده از آن است. این کار علاوه بر این که وقت‌گیر و حوصله‌بر است، کار حساسی نیز هست. چون در صورت طراحی غلط مشکلات زیادی به وجود خواهد آمد. توصیه این است که برای رفع این مشکل از پروژه‌ی Castle ActiveRecord استفاده کنید. ActiveRecord تقریباً یک Data Access Layer کامل است که کار با NHibernate را به شدت راحت‌تر می‌کند. خصوصاً این که با Castle ActiveRecord مشابه Fluent NHibernate دیگر نیازی به Xml Mapping وجود ندارد. علاوه بر این چون Castle ActiveRecord بر اساس NHibernate نوشته شده تمام امکانات NHibernate را هم هنوز می‌توان با آن استفاده کرد. مثلاً می‌توان با NHibernate.ISession به طور مستقیم در Castle ActiveRecord کار کرد.

توجه: این مطلب در ادامه نوشته‌ی «آیا ORM برای ما مناسب است؟» نوشته شده است.