کار با Complex Number ها در C#
OutputCache در ASP.NET MVC
ASP.NET MVC #13
خودکار کردن تعاریف DbSetها در EF Code first
- تمام مدلهای شما باید از کلاس مشخصی مثلا BaseEntity مشتق شوند.
- یا در تنظیمات برنامه مشخص کنید در حین Reflection چه فضای نامی باید جستجو شود.
- و یا مثلا مانند ASP.NET MVC اگر کلاسی نامش به عبارت خاصی ختم شد و همچنین از کلاس پایه خاصی نیز مشتق شده بود آنگاه بررسی شود.
ب)
- مرحله بعد اندکی ویرایش متد loadEntities است جهت خواندن مدلهای واقع شده مثلا در یک فضای نام خاص یا مشتق شده از یک کلاس پایه خاص و سپس افزودن خودکار آنها به modelBuilder همانند چیزی که در مثال فوق پیاده سازی شده.
در مثال بالا فقط یک اسمبلی جستجو میشود؛ اگر نیاز است تمام اسمبلیهای بارگذاری شده در برنامه جستجو شوند، روش کار مراجعه به AppDomain است:
foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) { Type t = currentassembly.GetType("typeName", false, true); if (t != null) {return currentassembly.FullName;} }
نکته:
برای ایجاد یک پروژهی جدید مایکروسافت Web Application را به شما پیشنهاد میدهد. هرچند در این مبحث، مطالبی را مبنی بر فواید Web Site معرفی خواهد کرد، ولی اکثر توسعه دهندگان وب که Web Site را برگزیده اند سرانجام مضراتی از آن را مییابند که سنگینی آن بیشتر از فوایدش است. برای مثال تمامی خصیصههای (feature فیچر) ASP.net لزومآ برای وب سایت در دسترس نخواهند بود؛ مثلآ از ویژوال استودیوی 2012 به بعد، ابزاری برای تولید پروژههای وب وجود دارد که فقط برای Web Application در اختیار خواهد بود (برای کسب اطلاعات بیشتر میتوانید مطلب Creating an ASP.net Web Project in Visual Studio را مطالعه نمایید).
سناریو :
سناریویی که مبنی برا انتخاب Web Application میباشد به شرح زیر است:
· شما نیاز به استفاده از Edit And Continue در دیباگر ویژوال استودیو دارید.
· تمامی کدها، فایلها و کلاسهایی که با صفحات ASP.net مرتبط هستند، برای تست بصورت واحد و یکپارچه در نظر گرفته میشوند.
· شما برای کلاسهایی که وابسته به صفحات هستند و همچنین برای کنترلها و کلاسهای منحصر آن باید ارجاع داشته باشید.
· وابستگی در حالتی که چندین پروژهی مرتبط به هم را دارید توسط شما مشخص میشود.
· برای کل سایت در هنگام کامپایل فقط یک اسمبلی ساخته میشود.
· کنترل نام اسمبلیها و همچنین شمارهی ورژن ایجاد شدهی برای پروژه در دست شماست.
· برای کامپایل پروژه میتوانید MSBuild و یا Team Build را انتخاب کنید؛ برای مثال میتوانید مراحل Prebuild یا Postbuild را مشخص کنید.
· نیازی به قرار دادن سورس برنامه روی سرور نیست.
سناریویی که مبنی برا انتخاب Web Site میباشد به شرح زیر است:
· یک پروژه در بر دارندهی کدهای #C و هم کدهای Visual Basic میباشد ( درحالیکه بصورت پیشفرض در Web Application فایل پروژه بر مبنای زبان برنامهی شما کامپایل میشود، هرچند میتوان این حالت پیشفرض را تغییر داد؛ ولی این امر میتواند اندکی مشکل باشد).
· شما میتوانید سایت ایجاد شده را بصورت Real Time توسط FTP باز نموده و آپدیت نمایید.
· برای توزیع (deploy) پروژه مجبور به کامپایل صریح آن نیستید.
· اگر پروژه را کامپایل نمایید کامپایلر به ازای هر صفحه و یا هر پوشه، یک فایل اسمبلی جداگانه خواهد ساخت.
· برای تغییر یک فایل به تنهایی میتوانید فقط آنرا تغییر داده و بر روی سرور قرار دهید.
· حتی بعد از کامپایل هم میتوانید صفحات ASP.net را بدون نیاز به کامپایل دوبارهی کل سایت تغییر داده و جایگزین نمایید.
· سورس کامل پروژه برای اجرا باید روی سرور قرار گیرد.
تفاوتها در یک نگاه:
زمینه | پروژههای Web Application | پروژههای Web Site |
ساختار فایل پروژه | فایل برنامه (.csproj / vbproj) دربردارنده اطلاعاتی از جمله لیست فایلها و رفرنسها پروژه به پروژه دیگر خواهد بود. | هیچ فایل برنامه ای وجود ندارد و تمامی فایل هایی که داخل پوشه میباشند جزو فایلهای سایت شناخته میشوند. |
کامپایل | · شما پروژه را در سیستم خود کامپایل میکنید. · بصورت پیشفرض کامپایل کدها در یک اسمبلی قرار میگیرد. |
· سورس کدها بصورت اتوماتیک در سرور توسط Asp.net با اولین درخواست کامپایل میشوند. (البته شما میتوانید کامپایل را در سیستم خود نیز انجام دهید) · بصورت پیشفرض کامپایل برای هر کلاس یک اسمبلی جدا میسازد. |
فضاهای نام | Namespaceها بصورت صریح در صفحات و کلاسها و کنترلها افزوده میشود. | هیچ namespace ای بصورت پیشفرض اضافه نمیشود (شما میتوانید بصورت دستی آنها را اضافه کنید) |
توزیع | اسمبلی تولید شده در مرحله کامپایل را روی سرور قرار میدهید اکثر مراحل کامپایل توسط ابزارهای ارائه شده ویژوال استودیو انجام میشود. | کل سورس پروژه روی سرور قرار میگیرد. اکثر مراحل کامپایل توسط ابزارهای ارائه شده ویژوال استودیو انجام میشود. |
ساختار فایل پروژه:
پروژههای Web Application از فایل پروژه ویژوال استودیو ( .csproj / .vbproj ) برای نگهداری اطلاعات پروژه استفاده میکنند. با این امکان میتوان فایلهایی را که در پروژه دخیل هستند و یا باید کامپایل شوند، به تفکیک مشخص کرد.
در مورد Web Site تمامی فایلهایی که در داخل پوشهی برنامه قرار دارند، به صورت پیش فرض جزیی از برنامه تلقی شده و کامپایل خواهند شد و برای اینکه فایلی را بخواهید مستثنا کنید یا باید آنرا حذف کنید و یا پسوند آنرا به نامی که توسط سرور IIS قابل شناسایی نیست تغییر دهید.
فایدهی فایل پروژه یعنی همان ( .csproj / .vbproj ) در Web Application :
میتوان فایلی را به طور موقت از برنامه حذف کرد، بدون نگرانی از آنکه فایل بصورت کلی حذف شود. چرا که فایل در ساختار برنامه باقیست. برای مثال اگر صفحهای برای توزیع آماده نیست، میتوانید به راحتی آنرا از برنامه خارج کنید ( Exclude ) و برنامه را کامپایل نمایید و بعد از اینکه این صفحه هم آماده شد، دوباره آن را وارد پروژه نمایید ( include ) که اهمیت این امر در مواردی که از برنامههای کنترل سورس استفاده میکنید، دوچندان میشود.
فایدهی عدم استفاده از فایل پروژهی برنامه در Web Site :
شما مجبور به کنترل و شخصی سازی ساختار فایل برنامه در ویژوال استودیو نیستید و به راحتی هر فایل یا صفحهای را که میخواهید، با کپی کردن به پوشه و یا حذف کردن از آن توسط فایل اکسپلورر انجام میدهید.
کامپایل:
برای برنامههای Web Application شما بصورت معمول پروژه را Build مینمایید و تمامی کدهای صفحات و همچنین کلاسها به صورت یک فایل اسمبلی در پوشهی bin ذخیره میگردد.
برای Web Site شما مجبور به کامپایل دستی پروژه نیستید و میتوانید از Batch-Compile استفاده کنید و همچنین به ازای هر صفحه و کلاسریال شما یک فایل اسمبلی خواهید داشت.
مزایای کامپایل در Web Application :
· میتوانید از MSBuild استفاده کنید.
· میتوانید خصیصههای اسمبلی، از جمله نام و ورژن را به راحتی مدیریت نمایید.
· کامپایل قبل از توزیع برنامه این مزیت را دارد که کاربران مجبور نیستند منتظر کامپایل برنامه در سرور باشند.
· مدیریت دقیقی بر روی فایلها و ساختار برنامه و همچنین کلاسها و ارجاعات خواهید داشت.
مزایای کامپایل در Web Site :
· میتوانید هر صفحهای را که نیاز دارید بدون در نظر گرفتن آماده شدن دیگر صفحات تست و اجرا نمایید.
· آپدیت و جایگزینی فایلها به راحتی صورت میگیرد؛ چرا که اسمبلی تمام فایلها بصورت منحصر همان صفحه ایجاد خواهد شد.
· ایجاد شدن چند اسمبلی میتواند در برخی پروژهها به نفع برنامه بوده و performance را بالا ببرد. برای مثال در حالتیکه یک سایت با صفحات زیاد دارید و برخی صفحات به نسبت دیگر صفحات خیلی کمتر درخواست میشوند.
نکته:
هیچ فرقی بین Web Application , و web Site از نظر performance وجود ندارد مگر درحالت ذکر شده در بالا و در سایتهای خیلی بزرگ.
توزیع : ( Deployment )
در web Site کل فایلهای پروژه را بر روی سرور قرار میدهید؛ درحالی که در Web Application فایلهای برنامه بصورت اسمبلیها ( .dll ) روی سرور قرار میگیرند. همین امر میتواند در برخی حالتها مثلآ زمانی که از هاست share شده استفاده میکنید، خیال شما را از بابت سورس برنامه مطمئن سازد.
برای Web Site نیز این مزیت وجود دارد که برای انجام تغییرات کوچک مجبور به کامپایل و آپلود دوبارهی کل پروژه نیستید.
ماخذ
اولین موردی که پس از دریافت NHibernate 3.0 ممکن است به چشم بخورد، نبود اسمبلی Log4Net است. مطابق درخواستهای کاربران، ارجاع مستقیم به این کتابخانه حذف شده و با یک اینترفیس عمومی به نام IInternalLogger جایگزین گشته است (قرار گرفته در فضای نام NHibernate.Logging). به این صورت میتوان از انواع و اقسام کتابخانههای ثبت وقایع نوشته شده برای دات نت استفاده کرد؛ مانند: log4net، Nlog، EntLib Logging و غیره.
البته لازم به ذکر است که همان روش قبلی استفاده از Log4Net هنوز هم پشتیبانی میشود (بدون نیاز به تغییر خاصی در کدهای خود)، زیرا پیاده سازی اینترفیس جدید IInternalLogger برای استفاده از آن به صورت پیش فرض توسط NHibernate انجام شده است.
یک مثال:
کتابخانهی سورس باز Common.Logging واقع شده در سورس فورج، در واقع یک logging abstraction framework است. به این معنا که تا به حال کتابخانههای ثبت وقایع مختلف و متعددی برای دات نت فریم ورک نوشته شده است و هر کدام راه و روش و پیاده سازی خاص خود را دارند. کتابخانهی Common.Logging لایهای است عمومی بر روی تمام این کتابخانهها مانند Log4Net، Enterprise Library Logging ، Nlog و غیره که برنامهی شما را از وابستگی مستقیم به هر کدام از موارد ذکر شده رها میسازد.
اکنون با توجه به وجود اینترفیس IInternalLogger در NHibernate 3.0 ، تنها کافی است این اینترفیس جهت استفاده از کتابخانهی Common.Logging پیاده سازی شود (abstraction اندر abstraction !). البته نیازی نیست اینکار انجام شود، زیرا پیشتر توسط پروژهی NHibernate.Logging در سایت کدپلکس اینکار صورت گرفته است.
بنابراین تنها کاری که باید انجام داد این است که :
الف) ارجاعاتی را به اسمبلیهای Common.Logging.dll (واقع در سورس فورج) و NHibernate.Logging.CommonLogging.dll (واقع در کدپلکس) به پروژهی خود اضافه کنید.
ب) ارجاعی را نیز به اسمبلی کتابخانهی ثبت وقایع مورد نظر خود نیز باید اضافه نمائید (مثلا NLog).
ج) سپس باید چند سطر زیر را به فایل app.config خود اضافه کنید:
<appSettings>
<add key="nhibernate-logger"
value="NHibernate.Logging.CommonLogging.CommonLoggingLoggerFactory, Hibernate.Logging.CommonLogging"/>
</appSettings>
NHibernate.Logging.CommonLogging.dll وقایع داخلی NHibernate را با پیاده سازی IInternalLogger به Common.Logging.dll منتقل میکند. سپس Common.Logging.dll این وقایع را به زبان کتابخانهی ثبت وقایع مورد نظر ترجمه خواهد کرد.
اطلاعات بیشتر: (+)
استفاده از StructureMap به عنوان یک IoC Container
مثلاً در مثال شما جهت اسکن اسمبلیها :
x.Scan(scan => { scan.AssemblyContainingType<IEmailsService>(); scan.WithDefaultConventions(); });
درست متوجه شدم؟
و سوال دیگر آیا امکان مشخص کردن Namespace جهت اسکن اسمبلیها توسط StructureMap وجود دارد؟
MongoDB #3
محیط MongoDB
نصب MongoDB در ویندوز
برای نصب MongoDB در ویندوز، اول باید آخرین نسخه MongoDB را از آدرس http://www.mongodb.org/downloads دریافت کنید. مطمئن شوید که نسخهی صحیحی از MongoDB را نسبت به معماری ویندوزتان دریافت کردهاید. برای پیدا کردن معماری ویندوز، پنجرهی Command Prompt را باز کنید و دستور زیر را اجرا کنید:
C:\>wmic os get osarchitecture OSArchitecture 64-bit C:\>
نسخههای 32بیتی MongoDB فقط پایگاه دادههای کوچکتر از 2 گیگابایت را پشتیبانی میکنند و صرفا برای تست و ارزیابی مناسب هستند. اکنون فایل دریافتی را نصب کنید. MongoDB یک پوشه داده، برای ذخیره فایلهایش نیاز دارد. مسیر پیش فرض پوشه داده c:\data\db است؛ بنابراین نیاز دارید این پوشه را بسازید. شما میتوانید یک مسیر دیگر را نیز برای مسیر داده تنظیم کنید. برای انجام این کار، Command Prompt را در پوشه bin (در مسیر نصب شده MongoDB) باز کنید و دستور زیر را اجرا کنید: (فرض کنید MongoDB در مسیر D:\set up\mongodb نصب شده است)
D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data"
بعد از اجرای دستور، پیام “waiting for connections” در کنسول نمایش داده میشود که نشان دهندهی این است که پروسه Mongod.exe با موفقیت اجرا شده است. حالا برای اجرای MongoDB یک Command Prompt دیگر نیاز دارید تا دستور زیر را اجرا کنید:
D:\set up\mongodb\bin>mongo.exe MongoDB shell version: 2.6.6 connecting to: test >db.test.save( { a: 1 } ) >db.test.find() { "_id" : ObjectId(5879b0f65a56a454), "a" : 1 } >
این دستور نشان خواهد داد که MongoDB نصب و با موفقیت اجرا شدهاست. برای اجرای MongoDB در دفعات بعدی نیز همین 2 مرحله را تکرار کنید (تعیین مسیر پوشه داده و اجرای Mongo.exe در یک Command Prompt دیگر).
نصب MongoDB در اوبونتو
دستور زیر را برای وارد کردن کلید GPG عمومی MongoDB در ترمینال اجرا کنید:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
فایل /etc/apt/sources.list.d/mongodb.list را با دستور زیر بسازید:
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
اکنون دستور زیر را برای بروز رسانی مخازن پکیجها اجرا کنید:
sudo apt-get update
حالا MongoDB را با استفاده از دستور زیر نصب کنید:
apt-get install mongodb-10gen=2.2.3
در دستور نصب فوق، به نسخهی 2.2.3 از MongoDB انتشار شده است. همیشه مطمئن شوید که آخرین نسخه را نصب کرده اید. اکنون MongoDB با موفقیت نصب شده است.
راه اندازی MongoDB
sudo service mongodb start
متوقف کردن MongoDB
sudo service mongodb stop
راه اندازی مجدد MongoDB
sudo service mongodb restart
برای استفاده از MongoDB از دستور زیر استفاده کنید:
Mongo
این دستور شما را به نمونهی در حال اجرای Mongod متصل خواهد کرد.
راهنمای MongoDB
برای دریافت لیست دستورات، ()db.help را در نسخه کلاینت MongoDB تایپ کنید. این دستور، لیست دستورات را مانند تصویر زیر به شما میدهد:
آمار و ارقام در MongoDB
برای گرفتن آمار و ارقام از MongoDB سرور، دستور ()db.stats را در نسخه کلاینت MongoDB تایپ کنید. این دستور نام پایگاه داده، تعداد مجموعهها و سندهای موجود در پایگاه داده را نمایش میدهد: