ICriteria API در NHibernate پیاده سازی الگوی Query Object است. مشکلی هم که این روش دارد استفاده از رشتهها جهت ایجاد کوئریهای متفاوت است؛ به عبارتی Type safe نیست. ایرادی هم به آن وارد نیست چون پیاده سازی اولیه آن از جاوا صورت گرفته و مباحث Lambda Expressions و Extension Methods هنوز در آن زبان به صورت رسمی ارائه نشده است (در JDK 7 تحت عنوان Closures قرار است اضافه شود). NHibernate 3.0 از ویژگیهای جدید زبانهای دات نتی جهت ارائهی محصور کنندهای Type safe حول ICriteria API استاندارد به نام QueryOver API سود جسته است. این پیاده سازی بسیار شبیه به عبارات LINQ است اما نباید با آن اشتباه گرفته شود زیرا LINQ to NHibernate یک ویژگی دیگر جدید، یکپارچه و استاندارد NHibernate 3.0 به شمار میرود.
برای نمونه در یک ICriteria query متداول، فراخوانیهای ذیل متداول است:
.Add(Expression.Eq("Name", "Smith"))
.Where<Person>(p => p.Name == "Smith")
مزیتهای این روش (strongly-typed fluent API) به شرح زیر است:
- خبری از رشتهها جهت استفاده از یک خاصیت وجود ندارد. برای مثال در اینجا خاصیت Name کلاس Person تحت کنترل کامپایلر قرار میگیرد و اگر در کلاس Person تغییراتی حاصل شود، برای مثال Name به LName تغییر کند، برنامه دیگر کامپایل نخواهد شد. اما در حالت ICriteria API یا باید به نتایج حاصل از Unit testing مراجعه کرد یا باید به نتایج بازخورد کاربران برنامه مانند: "باز برنامه رو تغییر دادی، یکجای دیگر از کار افتاد!" دقت نمود!
- اگر در حین ویرایش کلاس Person از ابزارهای Refactoring استفاده شود، تغییرات حاصل به صورت خودکار به تمام برنامه نیز اعمال خواهد شد. بدیهی است این اعمال تغییرات تنها در صورتی میسر است که خاصیت مورد نظر به صورت رشته معرفی نگردیده و ارجاعات به اشیاء تعریف شده به سادگی قابل parse باشند.
- در این حالت امکان بررسی نوع خواص تغییر کرده نیز توسط کامپایلر به سادگی میسر است و اگر ارجاعات تعریف شده به نحو صحیحی از این نوع جدید استفاده نکنند باز هم برنامه تا رفع این مشکلات کامپایل نخواهد شد که این هم مزیت مهمی در نگهداری سادهتر یک برنامه است.
- با بکارگیری Extension methods و پیاده سازی Fluent API جدید، مدت زمان یادگیری این روش نیز به شدت کاهش یافته، زیرا Intellisense موجود در VS.NET بهترین راهنمای استفاده از امکانات فراهم شده است. برای مثال جهت استفاده از ویژگی جدید QueryOver به سادگی میتوان پس از ساختن یک session جدید به صورت زیر عمل نمود:
IList<Cat> cats = session.QueryOver<Cat>().Where(c => c.Name == "Max").List();
جهت مشاهدهی معرفی کامل آن میتوان به مستندات NHibernate 3.0 مراجعه کرد.
Bootstrap 4 در واقع یک اقدام بزرگ بود که پس از یک سال توسعه، بزرگی این اقدام در خط به خط کدها احساس میگردد. تصمیم گرفتیم تا نسخهی اولیهی آن را به اشتراک بگذاریم و انتقادات و پیشنهادات شما را بشنویم. برای بهبود و پیشرفت در این زمینه، بسیاری از اخبار مرتبط را در اختیار شما قرار میدهیم. امیدواریم که ما را در بهتر شدن یاری کنید.
امکانات جدید Bootstrap
انتقال از Less به Sass
بهبود grid system مبتنی بر "rems"
h1 { /* 16 * 2.5 = 40px */ }
تغییر panel و wells به cards
Reset Component جایگزینی برای normalize.css
- زمانیکه کارهای زیادی به مرور زمان به یک متد محول و پارامترهایی برای کنترل رفتار متد در شرایط مختلف ایجاد میشود.
- این الگوی بد میتواند محصول جانبی مستقل کردن کلاسها و متدها باشد. فرض کنید در بدنه متدی، شیءای نیاز است و مکانیزم ساخته شدن این شیء نیز در بدنه همان متد پیاده سازی شدهاست. برای جداسازی منطق ایجاد شیء مربوطه، ممکن است تصمیم به انتقال آن به کلاس استفاده کننده از متد باشد. به این صورت که در آن کلاس، شیء مورد نیاز این متد ایجاد شود و به صورت پارامتر به این متد ارسال شود. زمانیکه تعداد این پارامترها زیاد شدند باید دقت بیشتری به کد داشت.
روشهای اصلاح این نوع کد بد بو
... var basePrice = _quantity * _itemPrice; var discountLevel = getDiscountLevel(); var finalPrice = discountedPrice (..., ..., ..., basePrice, discountLevel); ...
... var basePrice = _quantity * _itemPrice; var finalPrice = discountedPrice (..., ..., ..., basePrice); ...
... var dueDate = invoice.DueDate; var amount = invoice.Amount; var discount = invoice.Discount; var code = invoice.Code; var id = invoice.Id; IssuePayment(paymentType, id,dueDate,amount,discount,code); ...
... IssuePayment(paymentType, invoice); ...
جمع بندی
نحوه کار Expression و ایجاد یک DynamicFilter
آشنایی با jQuery Live
ابتدا باید فایل Media Creation Tool نسخهی 64بیتی را دانلود کنید. بوسیلهی این نرم افزار میتوانید نسخهی ISO یا نسخهی برخط و آنلاین را دریافت کنید. بعد از دریافت فایل ISO، بوسیلهی یه نرم افزار مانند Rufus فایل ISO را میتونید به یک فلش Bootable تبدیل کنید؛ یا اینکه بر روی DVD رایت کنید. در صورتیکه قصد ارتقاء نسخهی اصلی ویندوز فعلی خودتان را داشته باشید، نصاب Media Creation Tool از شما شمارهی سریال نرم افزار را درخواست نمیکند. در غیر اینصورت اگر قصد داشته باشید یک نصب از ابتدا (Clean Installation) را داشته باشید، باید شماره سریال معتبر محصول قبلی را جهت فعالسازی وارد نمایید. روال و فرآیند نصب که خیلی سهل و آسان است و نیازی به توضیح ندارد. ولی یک امکان عالی که به نسخهی جدید ویندوز اضافه شدهاست، پشتیبانی از تقویم فارسی هست. همانطور که مایکروسافت وعدهی آن را داده بود:
این مورد یکی از مهمترین تغییرات لااقل برای ما ایرانیها است. بعبارت دیگر در هر جا که تاریخ میلادی وجود داشته باشد، به تاریخ شمسی تبدیل خواهد شد. به عنوان مثال امکان مرتب سازی بر اساس تاریخ شمسی بی نقص امکان پذیر است:
و یا بعنوان مثال دیگر تاریخ خصیصهها به فرمت تاریخ شمسی نمایش داده میشود.
و مانند سایر تقویمها امکان سفارش نمودن آن وجود دارد.
مستندات باشگاه مشتریان بانک ملت
نمونه نحوه فراخوانی متد :
string additionalData = string.Format("{0},{1},;{2},{3},;", _MellatClubAccountNumber, (long)MellatClubShare, _MerchantAccountNumber, (long)MerchantShare); pgRepsonse = _gateway.bpCumulativeDynamicPayRequest( long.Parse(MerchantID), Username, Password, TransactionNo, (long)TotalAmount, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HHMMss"), additionalData, request.RedirectUrl );
مطابق با خروجی و پاسخی که از سامانه سهیم دریافت میکنید ، تیکه اول رو مقداردهی کنید.
MellatClubAccountNumber شناسه حساب شقایق: 123456789
MellatClubShare مبلغی که باید به عنوان سهم کارمزد شقایق، که در ریسپانس بنام systemShare برمیگردد، محاسبه و پرداخت کنید.
MerchantAccountNumber شناسه حساب چونک (پس از چند حسابه شدن درگاه مشخص میگردد)
if (systemShareAmount == 0 && merchantShareAmount == 0) payRequest = _melatServiceReference.bpPayRequest( bankServiceViewModel.MerchantId.ToLong(), bankServiceViewModel.Username, bankServiceViewModel.Password, alternativeOrderCode, payableAmount, DateTime.Now.DateToString(), DateTime.Now.TimeToString(), bankTokenRequestViewModel.AdditionalDataOne, bankTokenRequestViewModel.CallBackUrl, 0); else payRequest = _melatServiceReference.bpCumulativeDynamicPayRequest( bankServiceViewModel.MerchantId.ToLong(), bankServiceViewModel.Username, bankServiceViewModel.Password, alternativeOrderCode, payableAmount, DateTime.Now.DateToString(), DateTime.Now.TimeToString("HHMMss"), $"{mellatClubAccountNumber },{systemShareAmount},;{merchantAccountNumber },{merchantShareAmount},;", bankTokenRequestViewModel.CallBackUrl);
فایل مستندات:
Lazy loading در تزریق وابستگیها به کمک StructureMap
- ضمنا در اینجا Lazy تعریف کردن یک Set غیرضروری است. این Set فقط به یک جدول از بانک اطلاعاتی اشاره میکند و جزئی از کوئری LINQ نوشته شده خواهد بود. اگر قرار است چیزی را Lazy تعریف کنید، Lazy<IUnitOfWork> uow در سازندهی یک کلاس خواهد بود. کل شیء و نه یک خاصیت از آن. زمانیکه Uow وهله سازی میشود، تمام Setهای آن در دسترس هستند و Lazy تعریف کردن آنها در اینجا فایدهای ندارد.
- همچنین EF برای Setها مباحث Lazy loading خاص خودش را دارد و از این بحث جدا است.
با توجه به پیشرفت تکنولوژی و معماریهای مدرن، در اپلیکیشنهای امروزی سرعت و کارایی از مولفه هایی هستند که بیشتر احساس نیاز میشوند و درصورت عدم دارا بودن این مولفه ها، اپلیکیشن مورد توجه کاربران قرار نخواهد گرفت و درنهایت سودی به بار نخواهد آمد.
یکی از روشهای کسب این مولفهها استفاده از کشینگ در سطح ایپلیکیشن خودتون است.
در زیر پکیجی رو براتون معرفی میکنم که میتوانید در پروژههای دات نت خودتون کشینگ رو براحتی پیاده سازی کنید.
شما با استفاده از پکیج PolyCache براحتی و در سریعترین زمان میتونید کشینگ رو پیاده سازی کنید.
روال و جزئیات پیاده سازی در گیت هاب پروژه قرار گرفته است.