متدی برای بررسی صحت کد ملی وارد شده
چه نوع محیط کاری را بیشتر ترجیح میدهید؟
نسخه 0.4 Blazor
NHibernate کتابخانهی تبدیل شده پروژه بسیار محبوب Hibernate جاوا به سی شارپ است و یکی از ORM های بسیار موفق، به شمار میرود. در طی تعدادی مقاله قصد آشنایی با این فریم ورک را داریم.
چرا نیاز است تا از یک ORM استفاده شود؟
تهیه قسمت و یا لایه دسترسی به دادهها در یک برنامه عموما تا 30 درصد زمان کل تهیه یک محصول را تشکیل میدهد. اما باید در نظر داشت که این پروسهی تکراری هیچ کار خارق العادهای نبوده و ارزش افزودهی خاصی را به یک برنامه اضافه نمیکند. تقریبا تمام برنامههای تجاری نیاز به لایه دسترسی به دادهها را دارند. پس چرا ما باید به ازای هر پروژه، این کار تکراری و کسل کننده را بارها و بارها تکرار کنیم؟
هدف NHibernate ، کاستن این بار از روی شانههای یک برنامه نویس است. با کمک این کتابخانه، دیگر رویه ذخیره شدهای را نخواهید نوشت. دیگر هیچگاه با ADO.Net سر و کار نخواهید داشت. به این صورت میتوان عمده وقت خود را صرف قسمتهای اصلی و طراحی برنامه کرد تا کد نویسی یک لایه تکراری. همچنین عدهای از بزرگان اینگونه ابزارها اعتقاد دارند که برنامه نویسهایی که لایه دسترسی به دادهها را خود طراحی میکنند، مشغول کلاهبرداری از مشتریهای خود هستند! (صرف زمان بیشتر برای تهیه یک محصول و همچنین وجود باگهای احتمالی در لایه دسترسی به دادههای طراحی شده توسط یک برنامه نویس نه چندان حرفهای)
برای مشاهده سایر مزایای استفاده از یک ORM لطفا به مقاله "5 دلیل برای استفاده از یک ابزار ORM" مراجعه نمائید.
در ادامه برای معرفی این کتابخانه یک سیستم ثبت سفارشات را با هم مرور خواهیم کرد.
بررسی مدل سیستم ثبت سفارشات
در این مدل سادهی ما، مشتریها (customers) امکان ثبت سفارشات (orders) را دارند. سفارشات توسط یک کارمند (employee) که مسؤول ثبت آنها است به سیستم وارد میشود. هر سفارش میتواند شامل یک یا چند (one-to-many) آیتم (order items) باشد و هر آیتم معرف یک محصول (product) است که قرار است توسط یک مشتری (customer) خریداری شود. کلاس دیاگرام این مدل به صورت زیر میتواند باشد.
نگاشت مدل
زمانیکه مدل سیستم مشخص شد، اکنون نیاز است تا حالات (دادهها) آنرا در مکانی ذخیره کنیم. عموما اینکار با کمک سیستمهای مدیریت پایگاههای داده مانند SQL Server، Oracle، IBM DB2 ، MySql و امثال آنها صورت میگیرد. زمانیکه از NHibernate استفاده کنید اهمیتی ندارد که برنامه شما قرار است با چه نوع دیتابیسی کار کند؛ زیرا این کتابخانه اکثر دیتابیسهای شناخته شده موجود را پشتیبانی میکند و برنامه از این لحاظ مستقل از نوع دیتابیس عمل خواهد کرد و اگر نیاز بود روزی بجای اس کیوال سرور از مای اس کیوال استفاده شود، تنها کافی است تنظیمات ابتدایی NHibernate را تغییر دهید (بجای بازنویسی کل برنامه).
اگر برای ذخیره سازی دادهها و حالات سیستم از دیتابیس استفاده کنیم، نیاز است تا اشیاء مدل خود را به جداول دیتابیس نگاشت نمائیم. این نگاشت عموما یک به یک نیست (لزومی ندارد که حتما یک شیء به یک جدول نگاشت شود). در گذشتهی نچندان دور کتابخانهی NHibernate ، این نگاشت عموما توسط فایلهای XML ایی به نام hbm صورت میگرفت. این روش هنوز هم پشتیبانی شده و توسط بسیاری از برنامه نویسها بکار گرفته میشود. روش دیگری که برای تعریف این نگاشت مرسوم است، مزین سازی اشیاء و خواص آنها با یک سری از ویژگیها میباشد که فریم ورک برتر این عملیات Castle Active Record نام دارد.
اخیرا کتابخانهی دیگری برای انجام این نگاشت تهیه شده به نام Fluent NHibernate که بسیار مورد توجه علاقمندان به این فریم ورک واقع گردیده است. با کمک کتابخانهی Fluent NHibernate عملیات نگاشت اشیاء به جداول، بجای استفاده از فایلهای XML ، توسط کدهای برنامه صورت خواهند گرفت. این مورد مزایای بسیاری را همانند استفاده از یک زبان برنامه نویسی کامل برای تعریف نگاشتها، بررسی خودکار نوعهای دادهای و حتی امکان تعریف منطقی خاص برای قسمت نگاشت برنامه، به همراه خواهد داشت.
آماده سازی سیستم برای استفاده از NHibernate
در ادامه بجای دریافت پروژه سورس باز NHibernate از سایت سورس فورج، پروژه سورس باز Fluent NHibernate را از سایت گوگل کد دریافت خواهیم کرد که بر فراز کتابخانهی NHibernate بنا شده است و آنرا کاملا پوشش میدهد. سورس این کتابخانه را با checkout مسیر زیر توسط TortoiseSVN میتوان دریافت کرد.
البته احتمالا برای دریافت آن از گوگل کد با توجه به تحریم موجود نیاز به پروکسی خواهد بود. برای تنظیم پروکسی در TortoiseSVN به قسمت تنظیمات آن مطابق تصویر ذیل مراجعه کنید:
همچنین جهت سهولت کار، آخرین نگارش موجود در زمان نگارش این مقاله را از این آدرس نیز میتوانید دریافت نمائید.
پس از دریافت پروژه، باز کردن فایل solution آن در VS و سپس build کل مجموعه، اگر به پوشههای آن مراجعه نمائید، فایلهای زیر قابل مشاهده هستند:
Nhibernate.dll : اسمبلی فریم ورک NHibernate است.
NHibernate.Linq.dll : اسمبلی پروایدر LINQ to NHibernate میباشد.
FluentNHibernate.dll : اسمبلی فریم ورک Fluent NHibernate است.
Iesi.Collections.dll : یک سری مجموعههای ویژه مورد استفاده NHibernate را ارائه میدهد.
Log4net.dll : فریم ورک لاگ کردن اطلاعات NHibernate میباشد. (این فریم ورک نیز جهت عملیات logging بسیار معروف و محبوب است)
Castle.Core.dll : کتابخانه پایه Castle.DynamicProxy2.dll است.
Castle.DynamicProxy2.dll : جهت اعمال lazy loading در فریم ورک NHibernate بکار میرود.
System.Data.SQLite.dll : پروایدر دیتابیس SQLite است.
Nunit.framework.dll : نیز یکی از فریم ورکهای بسیار محبوب آزمون واحد در دات نت فریم ورک است.
برای سادگی مراجعات بعدی، این فایلها را یافته و در پوشهای به نام lib کپی نمائید.
برپایی یک پروژه جدید
پس از دریافت Fluent NHibernate ، یک پروژه Class Library جدید را در VS.Net آغاز کنید (برای مثال به نام NHSample1 ). سپس یک پروژه دیگر را نیز از نوع Class Library به نام UnitTests به این solution ایجاد شده جهت انجام آزمونهای واحد برنامه اضافه نمائید.
اکنون به پروژه NHSample1 ، ارجاع هایی را به فایلهای FluentNHibernate.dll و سپس NHibernate.dll در که پوشه lib ایی که در قسمت قبل ساختیم، قرار دارند، اضافه نمائید.
در ادامه یک پوشه جدید به پروژه NHSample1 به نام Domain اضافه کنید. سپس به این پوشه، کلاس Customer را اضافه نمائید:
namespace NHSample1.Domain
{
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryCode { get; set; }
}
}
using FluentNHibernate.Mapping;
namespace NHSample1.Domain
{
class CustomerMapping : ClassMap<Customer>
{
}
}
using FluentNHibernate.Mapping;
namespace NHSample1.Domain
{
class CustomerMapping : ClassMap<Customer>
{
public CustomerMapping()
{
Not.LazyLoad();
Id(c => c.Id).GeneratedBy.HiLo("1000");
Map(c => c.FirstName).Not.Nullable().Length(50);
Map(c => c.LastName).Not.Nullable().Length(50);
Map(c => c.AddressLine1).Not.Nullable().Length(50);
Map(c => c.AddressLine2).Length(50);
Map(c => c.PostalCode).Not.Nullable().Length(10);
Map(c => c.City).Not.Nullable().Length(50);
Map(c => c.CountryCode).Not.Nullable().Length(2);
}
}
}
سپس وضعیت نگاشت تک تک خواص کلاس Customer را مشخص میکنیم. توسط Id(c => c.Id).GeneratedBy.HiLo به سیستم اعلام خواهیم کرد که فیلد Id از نوع identity است که از 1000 شروع خواهد شد. مابقی موارد هم بسیار واضح هستند. تمامی خواص کلاس Customer ذکر شده، نال را نمیپذیرند (منهای AddressLine2) و طول آنها نیز مشخص گردیده است.
با کمک Fluent NHibernate ، بحث بررسی نوعهای دادهای و همچنین یکی بودن موارد مطرح شده در نگاشت با کلاس اصلی Customer به سادگی توسط کامپایلر بررسی شده و خطاهای آتی کاهش خواهند یافت.
برای آشنایی بیشتر با lambda expressions میتوان به مقاله زیر مراجعه کرد:
Step-by-step Introduction to Delegates and Lambda Expressions
ادامه دارد...
شاید دیدن تغییرات ظاهری سایتهای معروف دنیا طی 10 سال گذشته برایتان جالب باشد
نکته ای که داخل همه شان دیده میشود، سادگی هست.
ولی سوال اینجاست، آیا باید از ابتدا روی سادگی تمرکز کنیم؟ یا باید فرایند ریدیزاین، سیر رشد طبیعی خودش را طی کند؟
مثلا از ابتدا نیاییم و دیزاین محصولمان را در سادهترین حالت ممکن انجام دهیم چرا که فرهنگ و روش استفاده و نیز قابلیتهای محصول مان برای همگان آشکار نیست و شاید بهتر باشد در ابتدا طوری دیزاین کنیم که کمی از سادگی را فدای "آشکار ساختن دستور العمل استفاده و قابلیتهای محصول" مان کنیم.
با سلام؛ در صورتی که قصد ذخیره سازی اطلاعات یک محصول را داشته باشم و یکی از Propertyهای کلاس محصول ImageName باشد، باید نام عکس ارسالی را دریافت و دخیره کنیم، اکشن متد UpoadFiles نام عکس ذخیره شده را برگشت میدهد، حال به چه طریقی میتوان به این نام در اکشن متد Index دسترسی داشت؟ نام برگشتی از اکشن متد UploadFiles را در یک HiddenField قرار میدهم ولی باز هم در اکشن Index در دسترس نیست.
UrlRewriter توسط Intelligencia.UrlRewriter
string.Format("Details/{0}-{1}", Eval("Name").ToString().Replace(" ", "-"),Eval("id")