دانت فریم ورک با بهرهگیری از این تکنولوژیها، امکاناتی را برای ایجاد HTTP سرویسها، به ما میدهد و قبل از بکارگیری لازم است انتخاب کنیم که از کدام تکنولوژی باید استفاده کنیم.
Web Service
1. پایهی آن براساس SOAP است و دادهها را در قالب XML به ما میدهد.
2. فقط از HTTP پروتکل پشتیبانی میکند.
3. متن باز نیست اما میتوان از آن در هر کلاینتی که از XML پشتیبانی میکند، استفاده کرد.
4. فقط بر روی IIS میتوان آنرا هاست کرد.
WCF
1. پایهی پیش فرض آن براساس SOAP است و دادهها را در قالب XML به ما میدهد.
2. تکامل یافتهی وب سرویسها است (ASMX) و از پروتکلهای مختلفی همچون TCP, HTTP, HTTPS, Named Pipes, MSMQ پشتیبانی میکند.
3. مشکل اصلی WCF در بد قلقی و گسترده بودن تنظیمات آن میباشد.
4. متن باز نیست، اما میتوان از آن در هر کلاینتی که از XML پشتیبانی میکند، استفاده کرد.
5. بر روی IIS یا برنامهها و یا ویندوز سرویسها، میتوان آنرا هاست کرد.
WCF REST
1. برای استفاده از WCF و WCF REST باید حتما webHttpBindings را فعال کرده باشید.
2. از دستور العملهای HTTP Get و HTTP POST با استفاده از ترکیب خصیصههای [WebGet] و [WebInvoke] ، پشتیبانی میکند.
3. برای فعال کردن سایر دستور العملهای HTTP باید تنظیماتی را در IIS انجام دهید، تا درخواستهایی که بر اساس دستورالعملهای ویژهی در فایل svc. میباشند را قبول کند.
4. ارسال دیتا به آن از طریق پارامتر، با استفاده از WebGet احتیاج به تنظیماتی دارد و یا UriTemplate باید مشخص شود.
5. از XML, JSON and ATOM پشتیبانی میکند.
Web API
1. یک فریم ورک جدید برای ساختن HTTP سرویس، یک راه ساده و آسان.
2. متن باز است و یک راه ایده آل برای ساخت REST-ful سرویسها بر روی دات نت فریم ورک.
3. برخلاف WCF Rest، سرویسهای آن از ویژگیهای کامل HTTP مانند ( URIs, request/response headers, caching, versioning various content formats) پشتیبانی میکنند.
4. همچنین از ویژگیهای کامل MVC از قبیل routing, controllers, action results, filter, model binders, IOC container or dependency injection, unit testing بهسادگی و قوی پشتیبانی میکند.
5. بر روی IIS و یا برنامهها، میتوان آنرا هاست کرد.
6. یک معماری سبک و مناسب برای دستگاههایی که پهنای باند محدودی دارند، مانند گوشیهای هوشمند.
7. پاسخها بوسیله Web API’s MediaTypeFormatter به صورت JSON, XML فرمت میشوند؛ و یا هر فرمتی را که شما میخواهید، بهعنوان MediaTypeFormatter اضافه کنید .
انتخاب بین WCF یا WEB API
1.انتخاب WCF زمانی مناسب است که شما میخواهید یک سرویس را ایجاد کنید که باید از سناریوهای مختلفی از قبیل پیغامهای یکطرفه و صف پیغامها و ارتباطات دو طرفه پشتیبانی کند و یا میخواهید یک سرویس را ایجاد کنید که از کانالهای انتقال سریع استفاده کند؛ از قبیل TCP و Named Pipes و یا شاید گاهی UDP در WCF 4.5 و همچنین میخواهید از HTTP پشتیبانی کند؛ وقتی که همهی کانالهای دیگر انتقال در دسترس نیستند.
2. انتخاب Web API زمانی مناسب است که شما میخواهید یک resource-oriented سرویس را بر روی HTTP ایجاد کنید. در اینجا میتوان از ویژگیهای کامل HTTP مانند URIs, request/response headers, caching, versioning, various content formats استفاده کرد و یا میخواهید سرویس را در معرض طیف گستردهای از کلاینتها شامل مرورگرها، موبایلها، iphone و تبلت قرار دهید.
معرفی Mozilla's Fetch API
ASP.NET MVC #24
باز هم تشکر بخاطر مطالب و تجارب گرانبهایتان.
وقعاً به پست های پشت سرهم و بی وقفۀ شما عادت کرده بودیم.
لطفاً اگر امکان دارد بحث MVC را با رویکرد بکارگیری ORM ها ادامه دهید.
پیشاپیش متشکرم.
- چرا فرهنگ دزدی نرم افزار در کشور ما نهادینه شده است؟ | وبشهر | webshahr.org
- دانلود کتاب قانون تامین اجتماعی همراه با قوانین و مقررات مرتبط | www.parsbook.org
- نسخه پیش نمایش ویندوز ۸ زیر ذره بین (قسمت اول) | آراد حقی | fa.aradhaghi.com
- Projection در WinRT و نحوهی اتصال اجزای مختلف به یکدیگر | community.devexpress.com
- Scrum for Team System سورس باز شد | blogs.msdn.com
- Tiobe Index یا لیست میزان محبوبیت زبانهای برنامه نویسی ماه جاری | delphihaters.blogspot.com
- بررسی وضعیت توسعه VCL در آینده | community.devexpress.com
- تازههای TFS 11 | blogs.msdn.com
- تازههای پردازش موازی در دات نت 4 و نیم | blogs.msdn.com
- تغییرات بانکهای اطلاعاتی TFS 2010 و TFS 2011 | geekswithblogs.net
- چگونه حین کار با محصولات مایکروسافت میتوان به صورت قانونی کمتر هزینه کرد؟ | beyondrelational.com
- دیتابیس Stack Exchange جهت دریافت | blog.stackoverflow.com
- سرنوشت VCL در پارهای از ابهام | www.itwriting.com
- مروری بر WebMatrix 2 Beta | geekswithblogs.net
- نکاتی در مورد مستند سازی کدها | blogs.microsoft.co.il
درختهای دودویی Binary Trees
نحوه پیمایش درخت دودویی
این درخت پیمایشهای گوناگونی دارد ولی سه تای آنها اصلیتر و مهمتر هستند:
In-order یا LVR (چپ، ریشه، راست): در این حالت ابتدا گرههای سمت چپ ملاقات (چاپ) میشوند و سپس ریشه و بعد گرههای سمت راست.
Pre-Order یا VLR (ریشه، چپ، راست) : در این حالت ابتدا گرههای ریشه ملاقات میشوند. بعد گرههای سمت چپ و بعد گرههای سمت راست.
Post_Order یا LRV (چپ، راست، ریشه ): در این حالت ابتدا گرههای سمت چپ، بعد راست و نهایتا ریشه، ملاقات میشوند.
حتما متوجه شدهاید که منظور از v در اینجا ریشه است و با تغییر و جابجایی مکان این سه حرف RLV میتوانید به ترکیبهای مختلفی از پیمایش دست پیدا کنید.
اجازه دهید روی شکل بالا پیمایش LVR را انجام دهیم: همانطور که گفتیم باید اول گرههای سمت چپ را خواند، پس از 17 به سمت 9 حرکت میکنیم و میبینیم که 9، خود والد است. پس به سمت 6 حرکت میکنیم و میبینیم که فرزند چپی ندارد؛ پس خود 6 را ملاقات میکنیم، سپس فرزند راست را هم بررسی میکنیم که فرزند راستی ندارد پس کار ما اینجا تمام است و به سمت بالا حرکت میکنیم. 9 را ملاقات میکنیم و بعد عدد 5 را و به 17 بر میگردیم. 17 را ملاقات کرده و سپس به سمت 15 میرویم و الی آخر ...
6-9-5-17-8-15-10
VLR:
17-9-6-5-15-8-10
LRV:
6-5-9-8-10-15-17
نحوه پیاده سازی درخت دودویی:
public class BinaryTree<T> { /// <summary>مقدار داخل گره</summary> public T Value { get; set; } /// <summary>فرزند چپ گره</summary> public BinaryTree<T> LeftChild { get; private set; } /// <summary>فرزند راست گره</summary> public BinaryTree<T> RightChild { get; private set; } /// <summary>سازنده کلاس</summary> /// <param name="value">مقدار گره</param> /// <param name="leftChild">فرزند چپ</param> /// <param name="rightChild">فرزند راست /// </param> public BinaryTree(T value, BinaryTree<T> leftChild, BinaryTree<T> rightChild) { this.Value = value; this.LeftChild = leftChild; this.RightChild = rightChild; } /// <summary>سازنده بدون فرزند /// </summary> /// <param name="value">the value of the tree node</param> public BinaryTree(T value) : this(value, null, null) { } /// <summary>LVR پیمایش</summary> public void PrintInOrder() { // ملاقات فرزندان زیر درخت چپ if (this.LeftChild != null) { this.LeftChild.PrintInOrder(); } // ملاقات خود ریشه Console.Write(this.Value + " "); // ملاقات فرزندان زیر درخت راست if (this.RightChild != null) { this.RightChild.PrintInOrder(); } } } /// <summary> /// نحوه استفاده از کلاس بالا /// </summary> public class BinaryTreeExample { static void Main() { BinaryTree<int> binaryTree = new BinaryTree<int>(14, new BinaryTree<int>(19, new BinaryTree<int>(23), new BinaryTree<int>(6, new BinaryTree<int>(10), new BinaryTree<int>(21))), new BinaryTree<int>(15, new BinaryTree<int>(3), null)); binaryTree.PrintInOrder(); Console.WriteLine(); // خروجی // 23 19 10 6 21 14 3 15 } }
تفاوتی که این کد با کد قبلی که برای یک درخت معمولی داشتیم، در این است که قبلا لیستی از فرزندان را داشتیم که با خاصیت Children شناخته میشدند، ولی در اینجا در نهایت دو فرزند چپ و راست برای هر گره وجود دارند. برای جست و جو هم از الگوریتم In_Order استفاده کردیم که از همان الگوریتم DFS آمدهاست. در آنجا هم ابتدا گرههای سمت چپ به صورت بازگشتی صدا زده میشدند. بعد خود گره و سپس گرههای سمت راست به صورت بازگشتی صدا زده میشدند.
برای باقی روشهای پیمایش تنها نیاز است که این سه خط را جابجا کنید:
// ملاقات فرزندان زیر درخت چپ if (this.LeftChild != null) { this.LeftChild.PrintInOrder(); } // ملاقات خود ریشه Console.Write(this.Value + " "); // ملاقات فرزندان زیر درخت راست if (this.RightChild != null) { this.RightChild.PrintInOrder(); }
درخت دودویی مرتب شده Ordered Binary Search Tree
تا این لحظه ما با ساخت درختهای پایه آشنا شدیم: درخت عادی یا کلاسیک و درخت دو دویی. ولی در بیشتر موارد در پروژههای بزرگ از اینها استفاده نمیکنیم چرا که استفاده از آنها در پروژههای بزرگ بسیار مشکل است و باید به جای آنها از ساختارهای متنوع دیگری از قبیل درختهای مرتب شده، کم عمق و متوازن و کامل و پر و .. استفاده کرد. پس اجازه دهید که مهمترین درختهایی را که در برنامه نویسی استفاده میشوند، بررسی کنیم.
همان طور که میدانید برای مقایسه اعداد ما از علامتهای <>= استفاده میکنیم و اعداد صحیح بهترین اعداد برای مقایسه هستند. در درختهای جست و جوی دو دویی یک خصوصیت اضافه به اسم کلید هویت یکتا Unique identification Key داریم که یک کلید قابل مقایسه است. در تصویر زیر ما دو گره با مقدارهای متفاوتی داریم که با مقایسهی آنان میتوانیم کوچک و بزرگ بودن یک گره را محاسبه کنیم. ولی به این نکته دقت داشته باشید که این اعداد داخل دایرهها، دیگر برای ما حکم مقدار ندارند و کلیدهای یکتا و شاخص هر گره محسوب میشوند.
خلاصهی صحبتهای بالا: در هر درخت دودویی مرتب شده، گرههای بزرگتر در زیر درخت راست قرار دارند و گرههای کوچکتر در زیر درخت چپ قرار دارند که این کوچکی و بزرگی بر اساس یک کلید یکتا که قابل مقایسه است استفاده میشود.
این درخت دو دویی مرتب شده در جست و جو به ما کمک فراوانی میکند و از آنجا که میدانیم زیر درختهای چپ مقدار کمتری دارند و زیر درختهای راست مقدار بیشتر، عمل جست و جو، مقایسههای کمتری خواهد داشت، چرا که هر بار مقایسه یک زیر درخت کنار گذاشته میشود.
برای مثال فکر کنید میخواهید عدد 13 را در درخت بالا پیدا کنید. ابتدا گره والد 19 را مقایسه کرده و از آنجا که 19 بزرگتر از 13 است میدانیم که 13 را در زیر درخت راست پیدا نمیکنیم. پس زیر درخت چپ را مقایسه میکنیم (بنابراین به راحتی یک زیر درخت از مقایسه و عمل جست و جو کنار گذاشته شد). سپس گره 11 را مقایسه میکنیم و از آنجا که 11 کوچکتر از 13 هست، زیر درخت سمت راست را ادامه میدهیم و چون 16 بزرگتر از 13 هست، زیر درخت سمت چپ را در ادامه مقایسه میکنیم که به 13 رسیدیم.
مقایسه گرههایی که برای جست و جو انجام دادیم:
19-11-16-13
درخت هر چه بزرگتر باشد این روش کارآیی خود را بیشتر نشان میدهد.
در قسمت بعدی به پیاده سازی کد این درخت به همراه متدهای افزودن و جست و جو و حذف میپردازیم.
- تمرکز اصلی پروژه، باید صرف فائق آمدن بر مشکلات و پیچیدگیهای موجود در دامین شود.
- پیچیدگیهای موجود در دامین پس از شناسایی به یک مدل تبدیل شوند.
- برقراری یک رابطهی خلاق بین متخصصان دامین و افراد تیم توسعه برای بهبود مستمر مدل ارائه شده که نهایتا راه حل مشکلات دامین است بسیار مهم میباشد.
Eric Evans is a specialist in domain modeling and design in large business systems. Since the early 1990s, he has worked on many projects developing large business systems with objects and has been deeply involved in applying Agile processes on real projects. Eric is the author of "Domain-Driven Design" (Addison-Wesley, 2003) and he leads the consulting group Domain Language, Inc.
- دامین ساده و سر راست نباشد.
- افراد تیم توسعه با طراحی / برنامه نویسی شی گرا آشنا باشند.
- دسترسی به افراد متخصص در مسائل مرتبط با دامین آسان باشد.
- فرآیند تولید نرم افزار، یک فرآیند چابک باشد.
در ادامه میپردازم به اینکه ابزار DDD برای شکستن پیچیدگیهای دامین و تبدیل آنها به مدل کدامند؟
- Entity
- Value Object
- Aggregate
- Service
- Repository
- Factory
قبلا توضیح داده بودم که طراحی متاثر از حوزهی کاری (Domain Driven Design) منجر به کاهش، درک و نهایتا قابل مدیریت کردن پیچیدگیهای موجود در حوزه عملیاتی نرم افزار (Domain) میشود. توجه کنیم که تحلیل و مدلسازی، فعالیتهای رایج در حوزه هایی مانند حمل و نقل، اکتشافات، هوا فضا، شبکههای اجتماعی و ... میتواند بسیار دشوار باشد.
برای مثال فرض کنید که میخواهید به مدلسازی نرم افزاری بپردازید که هدف تولید آن پیش بینی وضع آب و هوا است. این حوزه کاری (پیش بینی وضع آب و هوا) بویژه همواره یکی از حوزه (Domain)های پیچیده برای طراحان مدل محسوب میشود. DDD روشی است که با بکار گیری آن میتوانید این پیچیدگیها را بسیار کاهش دهید. توسعه سیستمهای پیچیده بدون رعایت قواعدی همه فهم، نهایتا نرم افزار را به مجموعه ای از کدهای غیر خوانا و دیرفهم تبدیل میکند که احتمالا نسل بعدی توسعه دهندگانش را تشویق به بازنویسی آن خواهد کرد.
DDD در واقع روشی است برای دقیقتر فکر کردن در مورد نحوه ارتباط و تعامل اجزای مدل با یکدیگر. این سبک طراحی (DDD) به تولید مدلی از اشیاء میانجامد که نهایتا تصویری قابل درک (Model) از مسائل مطرح در حوزهی کاری ارائه میدهند. این مدل ارزشمند است وقتی که:
1- نمایی آشکار و در عین حال در نهایت سادگی و وضوح از همهی مفاهیمی باشد که در حوزه عملیاتی نرم افزار(Domain) وجود دارد.
2- به تناسب درک کاملتری که از حوزه کاری کسب میشود بتوان این مدل را بهبود و توسعه داد(Refactoring).
در DDD کوشش میشود که با برقراری ارتباطی منطقی بین اشیاء، و رعایت سطوحی از انتزاع یک مشکل بزرگتر را به مشکلات کوچکتر شکست و سپس به حل این مشکلات کوچکتر پرداخت.
توجه کنیم که DDD به چگونگی سازماندهی اشیاء توجه ویژه ای دارد ولی DDD چیزی درباره برنامه نویسی شی گرا نیست. DDD متدولوژیی است که با بهره گیری از مفاهیم شی گرایی و مجموعه ای از تجارب ممتاز توسعه نرم افزار (Best Practice) پیچیدگیها را و قابلیت توسعه و نگهداری نرم افزار را بهبود میدهد.
ایده مستتر در DDD ساده است. اگر در حوزه کاری مفهوم (Concept) ارزشمندی وجود دارد باید بتوان آن را به وضوح در مدل مشاهده کرد. برای مثال صحیح نیست که یک شرط ارزشمند حوزه کسب و کار را با مجموعهی سخت فهمی از If / Else ها، در مدل نشان داد. این شرط مهم را میتوان با Specification pattern پیاده سازی کرد تا تصویری خواناتر از Domain در مدل بوجود بیاید.
مدلی که دستیبابی به آن در DDD دنبال میشود مدلی است سر راست و گویا با در نظر گرفتن همه جوانب و قواعد حوزهی عمل نرم افزار. در این مدل مطلوب و ایده آل به مسائل ذخیره سازی (persistence) پرداخته نمیشود. (رعایت اصل PI). این مدل نگران چگونگی نمایش دادهها در واسط کاربری نیست. این مدل نگران داستانهای Ajax نیست. این مدل یک مدل Pureاست که دوست داریم حتی المقدور POCO باشد. این مدلی است برای بیان قواعد و منطق موجود در حوزه عمل نرم افزار. این قواعد همیشه تغییر میکنند و مدلی که از آموزههای DDDالهام گرفته باشد، راحتتر پذیرای این تغییرات خواهد بود. به همین دلیل DDD با روشهای توسعه به سبک اجایل نیز قرابت بیشتری دارد.
- استفاده همزمان از jQuery و ASP.NET AJAX UpdatePanel | مصطفی دیندار | anotherdeveloper.net
- تناقضات و نقایص طرح اداره صدا و سیما | www.ictna.ir
- گزارشی از وضعیت آموزشگاههای خصوصی IT در کشور | www.ictna.ir
- Auditing in SQL server | Alpesh Patel | beyondrelational.com
- SharpDevelop 4.2 و ساده سازی ایجاد خواص | community.sharpdevelop.net
- حجم بانک اطلاعاتی مدل در نگارشهای مختلف اس کیوال سرور | blogs.msdn.com
- حجم دات نت 4.5، 40 درصد کاهش یافته است | channel9.msdn.com
- کتاب رایگان Getting Results the Agile Way | blogs.msdn.com
- نمونهای از کاربرد دات نت Micro Framework | 10rem.net
- CRMهای ایرانی | blog.fardapardaz.com
- Mocking با استفاده از Moq | (Afshar Mohebbi) | blog.afsharm.com
- شروع به کار Qt Project | آرش | azadrah.net
- منتشر شد! Roslyn پیش نمایش سرویس کامپایلر سی شارپ و ویژوال بیسیک | www.persiadevelopers.com
- نرم افزار مدیریت بایگانی نامه های وارده و صادره | mojtabasahraei | mojtabasahraei.blogfa.com
- Extended WPF Toolkit–the updated PropertyGrid | elegantcode.com
- HTTP Pipelining In Chrome 17 | www.conceivablytech.com
- Microsoft® Visual Studio® Agents 11 Developer Preview (ISO) | www.microsoft.com
- Scaled Agile Framework | scalingsoftwareagility.wordpress.com
- 5 مانع مهم حین انطباق با سیستمهای سورس باز | brainslink.com
- گروه بندی story cards بر اساس رنگ | www.tinypm.com
- مجموعههای کمتر شناخته شده دات نت | www.simple-talk.com
مشکل در گروه بندی اطلاعات بر اساس تاریخ
GroupType = GroupType.IncludeGroupingColumns
template.DisplayFormatFormula(obj =>DateTimeHelper.ToPersianShortDateString((DateTime)obj));