<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkcFRXw_eip7ImA9WhRaEUk.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452</id><updated>2012-02-13T19:16:54.242+03:30</updated><category term="OPMLtools" /><category term="Denali" /><category term="Visual Studio" /><category term="MVVM" /><category term="Sql Server" /><category term="Others" /><category term="XML" /><category term="Tips" /><category term="Resource Governor" /><category term="Security" /><category term="AutoIt 3" /><category term="Blogger" /><category term="NoSQL" /><category term="Refactoring" /><category term="ASP.NET MVC" /><category term="ASP.NET" /><category term="C#" /><category term="Policy-Based Management" /><category term="RavenDB" /><category term="PowerShell" /><category term="WCF" /><category term="Linq" /><category term="Task Parallel Library" /><category term="Razor" /><category term="Tools" /><category term="NHibernate" /><category term="JavaScript" /><category term="WPF" /><category term="Design Patterns" /><category term="Entity Framework" /><category term="Database Mail" /><title>.NET Development</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.dotnetdev.info/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/mohammadsaheb" /><feedburner:info uri="mohammadsaheb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>mohammadsaheb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;D0UCR3wzeip7ImA9WhRbFkw.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-6171558601954827348</id><published>2012-02-07T15:17:00.001+03:30</published><updated>2012-02-07T15:17:46.282+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-07T15:17:46.282+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Razor" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC" /><title>ساختن متدهاي كمكي Razor در ASP.NET MVC</title><content type="html">&lt;p&gt;در نسخه 3 ي&amp;#160; ASP.NET MVC موتور نمايش(view-engine) جديدي بنام Razor اضافه شده ميزان كد نويسي View ها رو كم كرده.    &lt;br /&gt;يكي از قابليت هاي جالب اون ساختن متدهاي كمكي به صورت اعلانيه(Declarative) كه اين امكان رو ميده در همون فايل View مون بتونيم متدهاي كمكي بسازيم كه ازش در سرتاسر اون View استفاده كنيم.     &lt;br /&gt;براي مثال فرض كنيد جدولي داريم كه ستوني بنام قيمت(Price) داره حالا ميخواهيم اگه اون ستون كمتر از يك عددي بود اون ستون قرمز بشه و…     &lt;br /&gt;براي نوشتن اين مثال از سري آموزشي &lt;a href="http://www.asp.net/mvc/tutorials/mvc-music-store" target="_blank"&gt;MVC Music Store&lt;/a&gt; استفاده ميكنم.براي همين قسمت Model و Controllers رو نمينويسم.     &lt;br /&gt;براي نوشتن متد كمكي از Helper@ استفاده ميكنم و بقيه مراحل دقيقا مثل نوشتن يك متد عاديه البته تنها فرقش با متد اينه كه بدنه ي متد فقط شامل كدهاي C#‎ نيست.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;@helper PriceHighlighter(decimal inputPrice, decimal treshold)
    {
        if (inputPrice &amp;gt; treshold)
        {
            &amp;lt;span style=&amp;quot;background-color: red&amp;quot;&amp;gt;@inputPrice&amp;lt;/span&amp;gt;  
        }
        else
        {
            @inputPrice
        }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;همنطور كه گفتم فرق خاصي با متدهاي عادي نداره.ورودي رو با مقدار مورد نظرمون مقايسه ميكنيم و اگه بيشتر از اون بود يك تگ SPAN با رنگ قرمز و وروديمون برمي گردونيم(من زياد HTML م خوب نيست اگه بجز SPAN تگ ديگه ي ميشه استفاده كرد بگيد).&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;
&amp;lt;/td&amp;gt;
	@PriceHighlight(item.Price, 9)
&amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;نحوه استفاده هم مثل فراخواني يك متد عاديه. 
  &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/Razor_Helper.png" /&gt; 

  &lt;br /&gt;تا اينجا بسيار خوب ولي&amp;#160; چندتا مشكل&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;با زياد شدن تعداد متد ها View ي ما پر ميشه از اين متدها كه خوب نيست &lt;/li&gt;

  &lt;li&gt;امكان استفاده از اين متدها محدود به همون View ي هست كه متد داخلش نوشته شده &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;براي رفع اين مشكل ها بايد تعريف كدهاي كمكيمون رو تو سطح برنامه بنويسم به نوعي Scope كدها رو بيشتر كنيم تا در تمام View ها قابل استفاده باشه. 
  &lt;br /&gt;براي اينكار كافيه يك فولدر بنام App_Code داخل پروژه ايجاد كنيم و داخل اون يك MVC 3 View Page (Razor)‌‎ (يا هر آيتمي با پسوند CSHTML) اضافه كنيم(هرچي داخلش هست رو پاك كنيد) و متدهاي كمكي مورد نظرمون رو داخل اون اضافه كنيم. 

  &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/App_Code.png" /&gt; 

  &lt;br /&gt;نحوه استفاده هم مثل فراخواني متدهاي استاتيك يك كلاس ميمونه مثلا RazorHelpers.PriceHighlighter و…&lt;/p&gt;

&lt;p&gt;نكته:با استفاده از اين روش نميتونيم از متدهاي كمكي خود MVC كه از طريق Html به اونا دسترسي داريم استفاده كنيم.البته براي رفع اين مشكل روشي &lt;a href="http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views" target="_blank"&gt;اينجا&lt;/a&gt; معرفي شده كه ميتونيد استفاده كنيد.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-6171558601954827348?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/dZUGeQzuOKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/6171558601954827348/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2012/02/create-aspnet-mvc-3-razor-helpers.html#comment-form" title="7 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/6171558601954827348?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/6171558601954827348?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/dZUGeQzuOKg/create-aspnet-mvc-3-razor-helpers.html" title="ساختن متدهاي كمكي Razor در ASP.NET MVC" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>7</thr:total><feedburner:origLink>http://www.dotnetdev.info/2012/02/create-aspnet-mvc-3-razor-helpers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MBRH88cSp7ImA9WhRbEks.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-4839025067099314792</id><published>2012-02-03T14:02:00.001+03:30</published><updated>2012-02-03T14:07:35.179+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-03T14:07:35.179+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sql Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><title>نکات شرینک کردن فایل های دیتابیس در SQL Server</title><content type="html">&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/shrink.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;با ايده گرفتن از Arik Poznanski نتيجه گيريم رو از شرينك كردن فايل هاي ديتابيس اول مينويسم&lt;/p&gt;  &lt;h6 align="center"&gt;&lt;font size="4"&gt;«شرينك كردن در صورت نياز»&lt;/font&gt;&lt;/h6&gt;  &lt;p&gt;ما دو نوع شرينك كردن داريم&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;شرينك كردن ديتا فايل (خيلي بد) &lt;/li&gt;    &lt;li&gt;شرينك كردن لاگ فايل (بد) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;يه سري مفاهيم اوليه در شرينك هست كه در هر دو نوع شرينك ثابته اول اين مفاهيم رو مرور كنيم.    &lt;br /&gt;وقتي فايل هاي ديتابيس ميخوان بزرگ بشن بر اساس Autogrowth ي كه ست كرديد اون مقدار مورد نظر براي اطمينان از نداشتن بد سكتور بايد zero byte فرمت بشه حال فرض كنيد رشد بانك به صورت درصدي باشه (كه به صورت پيشفرض هست) و ديتابيس شما گيگا بايتي باشه چه حجم زيادي بايد zero byte فرمت بشه و اين يعني افت Performance. البته خبر خوب اينه كه عمل بزرگ شدن فايل از &lt;a href="http://www.dotnetdev.info/search/label/Sql%20Server" target="_blank"&gt;SQL Server 2005&lt;/a&gt; به بعد &lt;strong&gt;فقط &lt;/strong&gt;براي ديتا فايل با zero byte فرمت انجام نميشه (&lt;a href="http://msdn.microsoft.com/en-us/library/ms175935.aspx" target="_blank"&gt;Instant File Initialization&lt;/a&gt;).همه اينا رو گفتم تا برسم به اينجا كه بزرگ شدن فايل يه عمليات زمانبريه پس اگه شما از نظر حجم Storage مشكلي نداريد تا جاي كه امكان داره فايلهاي ديتابيستون رو شرينك نكنيد.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;چرا شرينك كردن ديتا فايل خيلي بده!      &lt;br /&gt;&lt;/strong&gt;وقتي شما ديتا فايلتون رو شرينك ميكنيد SQL مياد Extent (واحدي هست براي مديريت فضا شامل هشت Page پشت سر هم) هاي آخر فايل رو بدون توجه به ترتيب منطقي Page ها و Index ها تو قسمت هاي خالي اول فايل ميزاره و اين يعني تك تكه شدن (Fragmentation) ايندكس هاي شما (البته Clusterd ها) بنابراين كلا بيخيال اين نوع شرينك بشيد…     &lt;br /&gt;نکته:شرینک کردن با سویچ TRUNCATEONLY این جابجائی Extend ها رو نداره     &lt;br /&gt;همونطور كه ميدونيد شرينك كردن يكي از Task هاي موجود در Maintenance Plan هستش و بقول استادم&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&lt;strong&gt;SQL Server ي كه Maintenance Plan نداشته باشه معلومه DBA بالاسرش نيست &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;پس تقريبا همه سرور ها Maintenance Plan رو دارن چندتا نكته &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;شرينك كردن رو تا حد ممكن اتومات نكنيد &lt;/li&gt;    &lt;li&gt;با انجام Rebuild Index و بعد Shrink فقط و فقط وقت و منابع وكارايي و… سرور رو هدر كردين.دلیلش چيه؟ &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;چرا شرينك كردن لاگ فايل بده؟      &lt;br /&gt;&lt;/strong&gt;وقتی شما لاگ فایلتون (Transactional Log File) رو شرینک میکنید همونطور که قبلا گفتم با توجه به اینکه لاگ فایل &lt;strong&gt;باید&lt;/strong&gt; zero byte فرمت بشه موقع بزرگ شدن فایل بسته به میزان Autogrowth انتخابی سیستم شما افت Performance داره.البته از بین دو نوع شرینکی که گفتم انجام این نوع شرینک منطقی هست که البته بیشتر افراد برای «پراندن لاگ» میان لاگ فایل رو شرینک میکنن پس اگه شما مشکل حجم Storage ندارید میتونید این نوع شرینک رو هم انجام ندید توجه کنید تمام این پیشنهاد های که داده میشه با توجه به اینه که مدل Recovery شما رو FULL ست شده.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;یک نکته مهم «Truncate شدن لاگ اندازه فیزیکی اونو کم نمیکنه»&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/truncate_donot_reduce_log_size.gif" /&gt;&lt;/p&gt;  &lt;p&gt;همنطور که میدونید اگه مدل Recovery شما FULL باشه بعد از لاگ بکاپ گرفتن لاگ فایل شما Truncate میشه ولی نکته مهم اینه Truncate شدن لاگ اندازه فیزیکی اونو کم نمیکنه بلکه اون قسمت رو مجددا قابل نوشتن میکنه.همنطور که گفتم انجام این نوع شرینک منطقی هست. کی و کجا؟    &lt;br /&gt;فرض کنید شما تو سرور ساعت 5 صبح Maintenance Plan تعریف کردید و همیشه میبنید که لاگ بکاپ ساعت 7 صبح شما خیلی بزرگه مشکل کجاس؟     &lt;br /&gt;تمام عملیات Maintenance Plan تو لاگ نوشته میشه(&lt;a href="http://www.dotnetdev.info/2009/08/sql-server.html" target="_blank"&gt;والبته تمام عملیات SQL Server به صورت write-ahead&lt;/a&gt;) و این باعث میشه لاگ فایل شما بزرگ بشه و چون حتی پس از لاگ بکاپ گرفتن این فضا کم نمیشه ازاینرو یکی از جاهای که میشه لاگ رو شرینک کرد(پراند) اینجاس.البته برای کم کردن اندازه لاگ بکاپ ساعت 7 فکر میکردم تغییر مدل Recovery به BULK_LOGGED جواب بده ولی نوچ!(باید بشتر مطالعه کنم)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;در آخر شما Auto_Shrink رو تو &lt;a href="http://www.dotnetdev.info/search/label/Sql%20Server" target="_blank"&gt;SQL Server&lt;/a&gt; فعال میکیند؟&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-4839025067099314792?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/4JqmjlwiWhI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/4839025067099314792/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2012/02/sql-server-shrink-database-files-tips.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4839025067099314792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4839025067099314792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/4JqmjlwiWhI/sql-server-shrink-database-files-tips.html" title="نکات شرینک کردن فایل های دیتابیس در SQL Server" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2012/02/sql-server-shrink-database-files-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEHRn4zfCp7ImA9WhRWGUk.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-7407821751884508307</id><published>2012-01-07T18:16:00.001+03:30</published><updated>2012-01-07T18:17:17.084+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-07T18:17:17.084+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sql Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Database Mail" /><title>استفاده از Hotmail در SQL Server Database Mail</title><content type="html">&lt;p&gt;نداشتن بكاپ در يك سازمان باعث فاجعه ميشه.اوايل گزينه مد نظرم براي چك كردن Job مربوط به بكاپ گرفتن استفاده از Notifications خود &lt;a href="http://www.dotnetdev.info/search/label/Sql%20Server" target="_blank"&gt;SQL Server&lt;/a&gt; و ارسال ايميل بود ولي يه مشكل كوچيك اين وسط بود &lt;strong&gt;نداشتن Mail Server در سازمان.      &lt;br /&gt;&lt;/strong&gt;تا قبل از اينكه اين مطلب رو بنويسم فكر ميكردم بايد حتما داخل سازمان خودمون Mail Server داشته باشيم.اين برداشت من داخل كلاس بود.اينم مدركش (به احتمال زياد من مطلب رو بد گرفته بودم!)     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/WrongConcept.jpg" /&gt;با اين فكر غلط هروز صبح بايد اين كوئري رو اجرا ميكردم&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt; &lt;pre class="brush: sql"&gt;

SELECT
    CAST(CONVERT(DATETIME , CAST(run_date AS CHAR(8)) , 101) AS CHAR(11)) AS 'Failure Date' ,
    SUBSTRING(T2.name , 1 , 100) AS 'Job Name' ,
    T1.step_id AS 'Step #' ,
    T1.step_name AS 'Step Name' ,
    T1.message AS 'Message'
FROM
    msdb..sysjobhistory T1
    JOIN msdb..sysjobs T2
        ON T1.job_id = T2.job_id
WHERE
    T1.run_status != 1 AND
    T1.step_id != 0 AND
    run_date &gt;= CONVERT(CHAR(8) , (
                                    SELECT
                                        DATEADD(day , ( -1 * 30 ) , GETDATE())
                                  ) , 112)
ORDER BY
    1 DESC

&lt;/pre&gt;
&lt;/div&gt;



&lt;p&gt;تا اينكه اين &lt;a href="http://www.mssqltips.com/sqlservertip/2578/setup-database-mail-to-use-a-gmail-hotmail-yahoo-or-aol-account" target="_blank"&gt;پست&lt;/a&gt; رو ديدم.تنها كاري كه بايد انجام ميدادم ست كردن مشخصات SMTP سرور مدنظرم بود. 

  &lt;br /&gt;

  &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/setupAccount.png" /&gt;&lt;/p&gt;

&lt;p&gt;مرحله بعد هم اضافه كردن يك اپراتور (در اينجا اپراتوري به نام Mohammad.Saheb) با يك ايميل معتبر در سرور هست و همچنيا ست كردن اين اپراتور براي ارسال ايميل در صورت خطا در اجراي Job مربوطه. 
  &lt;br /&gt;

  &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/setNotificationOperator.png" width="592" height="143" /&gt;&lt;/p&gt;

&lt;p&gt;اينم يه نمونه از ارسال ايميل به اپراتور (Operator) تعريف شده&lt;/p&gt;

&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/testDatabaseMail.png" width="594" height="37" /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;در آخر باتوجه به نزديك شدن فصل شيرين! امتحانات يه مدتي نيستم.التماس دعا&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-7407821751884508307?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/Wmiwu2a4ah4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/7407821751884508307/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2012/01/using-hotmail-for-sql-server-database.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7407821751884508307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7407821751884508307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/Wmiwu2a4ah4/using-hotmail-for-sql-server-database.html" title="استفاده از Hotmail در SQL Server Database Mail" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2012/01/using-hotmail-for-sql-server-database.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYHQXkyfyp7ImA9WhRXF0g.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-1469411029397202146</id><published>2011-12-24T21:38:00.001+03:30</published><updated>2011-12-24T21:38:50.797+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-24T21:38:50.797+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>اصل Dependency Inversion چیست؟</title><content type="html">&lt;p&gt;در سري پست هاي تعريف اصول SOLID&amp;#160; با &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html"&gt;اصل Single Responsibility&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html"&gt;اصل Open Closed&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-liskov-substitution-principle.html" target="_blank"&gt;اصل Liskov Substitution&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-interface-segregation-principle.html" target="_blank"&gt;اصل Interface segregation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;آشنا شديم در اين پست پنجمین اصل يعني Dependency inversion رو برسي ميكنيم.    &lt;br /&gt;هدف Dependency inversion اینه که کلاس های سطح بالا نبایستی به صورت مستقیم وابسته به کلاس های سطح پایین باشن بلکه رابطه ی بین کلاس ها بایستی براساس Abstract ها یا Interface ها باشه. بعنوان مثال اگه کلاس سطح بالای سیستم رو business logic بدونیم و این سطح وابسته به جزئیات سطح پایین مثلا ذخیره در بانک اطلاعاتی باشه&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;استفاده مجدد از کلاس های business logic مارو کم میکنه &lt;/li&gt;    &lt;li&gt;انجام تست روی کلاس های business logic ما سخت میشه &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;عکس زیر برگرفته از کتاب Dependency Injection in .NET هست که Dependency Injection (الگويي براي رعايت اين اصل) رو بخوبی توضیح داده&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/tightly coupled.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;مدير يك هتل ارزان قيمت براي اينكه سشوار دزيده نشه اونو به پريز بسته و اين يعني وابستگي بين سشوار و پريز تغيير در هركدوم ;ديگري رو تحت تاثير قرار ميده.    &lt;br /&gt;و اما براي &lt;a href="http://numainnovations.com/mentis-vulgaris/jason/software-development/is-your-code-solid-the-interface-segregation-principle/"&gt;مثال&lt;/a&gt; عملي فرض كنيد کلاسی بنام GetMessageFromDatabase داریم که یک پیغام رو از دیتابیس لود میکنه و کلاسی بنام DisplayMessage داریم که اون پیغام رو نمایش میده.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt; 
   class Program
    {
        static void Main(string[] args)
        {
            DisplayMessage dm = new DisplayMessage();
            dm.ShowMessage();
        }
    }

    public class DisplayMessage
    {
        GetMessageFromDatabase Gmd;

        public DisplayMessage()
        {
            Gmd = new GetMessageFromDatabase();
        }
        public void ShowMessage()
        {
            Console.WriteLine(Gmd.GetMessage());
            Console.ReadLine();
        }
    }

    public class GetMessageFromDatabase
    {
        public string GetMessage()
        {
            return &amp;quot;Hi from database&amp;quot;;
        }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;فرض کنید چند وقت دیگه سیستم نیاز پیدا میکنه که پیغام علاوه بر دیتابیس از یک فایل XML هم خونده بشه.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt; public void ShowMessage()
        {
            if (source.ToUpper() == &amp;quot;DATABASE&amp;quot;)
            {
                GetMessageFromDatabase Gmd = new GetMessageFromDatabase();
                Console.WriteLine(Gmd.GetMessage());
                Console.ReadLine();
            }
            else if (source.ToUpper() == &amp;quot;XML&amp;quot;)
            {
                GetMessageFromXML Gmx = new GetMessageFromXML();
                Console.WriteLine(Gmx.GetMessage());
                Console.ReadLine();
            }
          
        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;چند وقت دیگه هم نیاز به خوندن از فایل متنی و… 
  &lt;br /&gt;چیزی که مشخصه وابسته بودن کلاس DisplayMessage به جایی که پیغام از اون میاد هست و این یعنی نقض اصل Dependency inversion. 

  &lt;br /&gt;و اما برای رفع این مشکل از اینترفیس استفاد میکنیم. کلاس های GetMessageFromDatabase&amp;#160; و GetMessageFromXML و … هم این اینترفیس رو پیاده سازی میکنن.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt; 
public interface IGetData
    {
        string GetMessage();
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;کلاس DisplayMessage رو هم به شکل زیر تغییر میدیم&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt; 
public class DisplayMessage
    {
        IGetData IGLocal;

        public DisplayMessage(IGetData IG)
        {
            IGLocal = IG;

        }
        public void ShowMessage()
        {
            Console.WriteLine(IGLocal.GetMessage());

        }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;نحوه فراخوانی هم بشکل زیر میشه&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt; 
static void Main(string[] args)
        {
            IGetData IG;

            string source = args[0].ToString();

            if (source.ToUpper() == &amp;quot;DATABASE&amp;quot;)
            {
                IG = new GetMessageFromDatabase();
            }
            else if (source.ToUpper() == &amp;quot;XML&amp;quot;)
            {
                IG = new GetMessageFromXML();
            }
            else if (source.ToUpper() == &amp;quot;TEXT&amp;quot;)
            {
                IG = new GetMessageFromTextFile();
            }
            else
            {
                IG = new GetMessageFromDatabase();//default set to database
            }

            DisplayMessage dm = new DisplayMessage(IG);
            dm.ShowMessage();


        }&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-1469411029397202146?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/1aUlPS4m41U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/1469411029397202146/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/12/what-is-dependency-inversion-principle.html#comment-form" title="1 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1469411029397202146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1469411029397202146?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/1aUlPS4m41U/what-is-dependency-inversion-principle.html" title="اصل Dependency Inversion چیست؟" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/12/what-is-dependency-inversion-principle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8BQ3k4eSp7ImA9WhRXFk8.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-4314598764449095561</id><published>2011-12-23T11:22:00.001+03:30</published><updated>2011-12-23T11:24:12.731+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-23T11:24:12.731+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>اصل Interface Segregation چیست؟</title><content type="html">&lt;p&gt;در سري پست هاي تعريف اصول SOLID&amp;#160; با &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html"&gt;اصل Single Responsibility&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html"&gt;اصل Open Closed&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-liskov-substitution-principle.html" target="_blank"&gt;اصل Liskov Substitution&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;آشنا شديم در اين پست چهارمین اصل يعني Interface Segregation رو برسي ميكنيم.    &lt;br /&gt;همنطور که قبلا اشاره کردم هدف این اصل اینه که اینترفیس بزرگ رو براساس استفاده کننده های اون اینترفیس و اهداف مختلف به اینترفیس های کوچکتر تبدیل کنیم و در نتیجه یک استفاده کننده از اون اینترفیس (مثلا یک کلاس) رو مجبور به پیاده سازی متدهای که بهشون نیاز نداره نکنیم و کلاس های پیچیده هم بجای استفاده از یک اینترفیس بزرگ از چندین اینترفیس استفاده کنن. توجه کنید که اگه ما کلاسی رو مجبور کنیم مثلا یک متد رو که اصلا بهش نیاز نداره پیاده سازی کنه و برای مثال بیاد تو اون متد NULL برگردونه یا مثلا Exception صادر کنه علاوه بر نقض اصل&amp;#160; Interface Segregation ;در ارث بری ما اصل &lt;a href="http://www.dotnetdev.info/2011/12/what-is-liskov-substitution-principle.html" target="_blank"&gt;Liskov Substitution&lt;/a&gt; رو هم نقض کردیم.     &lt;br /&gt;به عکس زیر توجه کنید فرض کنید تو یک پروژه Web بخواهید ASP.NET Membership رو شخصی سازی کنید و مثلا قسمت بازیابی با ایمیل رو تغییر بدید تقریبا میشه گفت بیخیال این کار میشید     &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/MembershipProvider  Violates Interface Segregation Principle.png" /&gt;     &lt;br /&gt;و اما براي &lt;a href="http://numainnovations.com/mentis-vulgaris/jason/software-development/is-your-code-solid-the-interface-segregation-principle/"&gt;مثال&lt;/a&gt; عملي فرض كنيد اینترفیسی بنام IAuthorizationProvider داریم و کارش مدیریت مجوز&amp;#160; و نقش ها در سیستم هست.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt; 
public interface IAuthorizationProvider
{
    IMyIdentity GetRolesFor(IIdentity identity);
    MembershipInfo GetRoleMembershipInfo(string role);
    IEnumerable&lt;string&gt; Roles { get; }

    void AddRole(RoleInfo roleInfo);
    void AddSubjectToRole(string role, IIdentity identity);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;با نگه به بدنه این اینترفیس 2 نوع مصرف کننده برا این اینترفیس میتوان متصور شد&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;مصرف کننده های که میخوان بدونن آیا یک فرد مجاز به انجام کاری هست &lt;/li&gt;

  &lt;li&gt;مصرف کننده های که میخوان مجوزها و نقش ها رو مدیریت کنن و بدون یک فرد چه مجوز و نقش های داره &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مشکلی که پیش میاد فرض کنید مصرف کننده ی میخواد فقط اطلاعات مربوط به مجوزهای&amp;#160; یک عضو رو داشته باشه. با اینترفیس موجود ما مصرف کننده رو مجبور به پیاده سازی متد های کردیم که ازشون استفاده نمیکنه (در اینجا متدهای اضافه کردن نقش و…) و با این نوع تعریف اینترفیس ما اصل Interface Segregation رو نقض کردیم. 
  &lt;br /&gt;و اما برای رفع این مشکل و رعایت کردن Interface Segregation به کد زیر توجه کنید&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;
public interface IAuthorizationProvider
{
    IMyIdentity GetAuthorizations(IIdentity identity);
}

public interface IRoleManager
{
    MembershipInfo GetRoleMembershipInfo(string role);
    IEnumerable&lt;string&gt; Roles { get; }

    void AddRole(RoleInfo roleInfo);
    void AddSubjectToRole(string role, IIdentity identity);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;با این اینترفیس در واقع ما براساس نیازهای مصرف کننده اومدیم اینترفیس رو شکستیم به دو اینترفیس تا مصرف کننده رو مجبور به پیاده سازی متد های که نیازی بهشون نداره نکنیم.&lt;/p&gt;

&lt;p&gt;ادامه دارد …&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-4314598764449095561?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/fJW5fIGOJ24" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/4314598764449095561/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/12/what-is-interface-segregation-principle.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4314598764449095561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4314598764449095561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/fJW5fIGOJ24/what-is-interface-segregation-principle.html" title="اصل Interface Segregation چیست؟" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/12/what-is-interface-segregation-principle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEFSXkycSp7ImA9WhRXE0o.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-4727777246669483505</id><published>2011-12-20T12:44:00.001+03:30</published><updated>2011-12-20T12:46:58.799+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-20T12:46:58.799+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>اصل Liskov Substitution چيست؟</title><content type="html">&lt;p&gt;در سري پست هاي تعريف اصول SOLID&amp;#160; با &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html" target="_blank"&gt;اصل Single Responsibility&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html" target="_blank"&gt;اصل Open Closed&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;آشنا شديم در اين پست سومين اصل يعني Liskov substitution رو برسي ميكنيم.    &lt;br /&gt;هدف اين اصل اينه كه در ارث بري كلاس مشتق شده بايد به گونه اي طراحي بشه كه در صورت نياز با كلاس پايه ي خودش قابل تعويض باشه.     &lt;br /&gt;مثال ي كه تو تعاريف اين اصل معمولا مطرح ميشه     &lt;br /&gt;&lt;strong&gt;آيا مربع يك مستطيل هست؟      &lt;br /&gt;&lt;/strong&gt;در منطق هندسه یک مربع نوع خاصی از مستطیل هست که دارای چهار ضلع مساوی میباشد ولي در شي گرائي داستان چيز ديگس…     &lt;br /&gt;در واقع ما با ارث بردن كلاس مربع از كلاس مستطيل اصل Liskov substitution رو نقض ميكنيم چون با فرض وجود متد هاي setWidth و setHeight در كلاس مستطيل ما مجبوريم اين متد ها رو به گونه ي در كلاس مربع تغيير بديم كه طول و عرض يكي بشه و از اين رو كلاس مشتق شده يعني مربع قابل تعويض با كلاس پايه يعني مستطيل نيست و…     &lt;br /&gt;اين اصل با &lt;a href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html" target="_blank"&gt;اصل Open Closed&lt;/a&gt; ارتباط داره توجه كنيد اگه شما نتونيد از كلاس مشتق شدتون بجاي كلاس پايه استفاده كنيد در واقع و بنوعي &lt;a href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html" target="_blank"&gt;اصل Open Closed&lt;/a&gt; رو رعايت نكرديد.     &lt;br /&gt;و اما براي &lt;a href="http://www.blackwasp.co.uk/LSP_2.aspx" target="_blank"&gt;مثال&lt;/a&gt; عملي فرض كنيد كلاسي بنام Project داريم كه كارش لود كردن و ذخيره كردن فايل هاي پروژه (از نوع ProjectFile) هست.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;public class Project
{
    public Collection&lt;projectfile&gt; ProjectFiles { get; set; }

    public void LoadAllFiles()
    {
        foreach (ProjectFile file in ProjectFiles)
        {
            file.LoadFileData();
        }
    }

    public void SaveAllFiles()
    {
        foreach (ProjectFile file in ProjectFiles)
        {
           file.SaveFileData();
        }
    }
}


public class ProjectFile
{
    public string FilePath { get; set; }

    public byte[] FileData { get; set; }

    public void LoadFileData()
    {
        // خواندن فايل از ديسك
    }

    public virtual void SaveFileData()
    {
        // نوشتن فايل در ديسك
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;اين كلاس كار خودش رو خوب انجام ميده تا اينكه با توجه به نياز كلاسي بنام ReadOnlyFile كه از ProjectFile مشتق شده وارد سيستم ميشه.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class ReadOnlyFile : ProjectFile
{
    public override void SaveFileData()
    {
        throw new InvalidOperationException();
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;با توجه به فقط خواندني بودن در فراخواني متد SaveFileData يك استثناء (Exception) صادر ميكنيم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public void SaveAllFiles()
    {
        foreach (ProjectFile file in ProjectFiles)
        {
            if (file as ReadOnlyFile == null)
                file.SaveFileData();
        }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;مشكل بعدي ما با متد SaveAllFiles هست كه به راحتي با چك كردن نوع فايل اگه ReadOnlyFile بود ازش صرف نظر ميكنيم و بدين سان Liskov substitution رو نقض كرديم. 
  &lt;br /&gt;يكي از راه هاي تشخيص نقض كردن Liskov substitution وجود دستور شرطي “آيا اين شي از اين نوع است” در كد هست. 

  &lt;br /&gt;و اما راه حل&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class Project
{
    public Collection&lt;projectfile&gt; AllFiles { get; set; }
    public Collection&lt;writeablefile&gt; WriteableFiles { get; set; }

    public void LoadAllFiles()
    {
        foreach (ProjectFile file in AllFiles)
        {
            file.LoadFileData();
        }
    }

    public void SaveAllWriteableFiles()
    {
        foreach (WriteableFile file in WriteableFiles)
        {
            file.SaveFileData();
        }
    }
}


public class ProjectFile
{
    public string FilePath { get; set; }

    public byte[] FileData { get; set; }

    public void LoadFileData()
    {
        // خواندن فايل از ديسك
    }
}


public class WriteableFile : ProjectFile
{
    public void SaveFileData()
    {
        // نوشتن فايل در ديسك
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;براي رفع بجاي يك كلكسيون از 2 كلكسيون فايل هاي پروژه استفاده شده يكي شامل تمام فايل هاي پروژه و ديگري شامل فايل هاي قابل نوشتن. كلاس ProjectFile فقط شامل متد LoadFileData هست كه براي هر دونوع فايل هاي پروژه قابل استفاده هست و كلاس WriteableFile هم متد SaveFileData رو اضافه كرده. 
  &lt;br /&gt;يكي از راه هاي رعايت كردن اين اصل استفاده از اصل Interface segregation هست كه البته تو اين مثال از اينترفيس استفاده نشده و بحث سر اينه كه بي جهت كلاسي رو وادار به استفاده از متد اضافه نكنيم مثلا در همين مثال متد SaveFileData.&lt;/p&gt;

&lt;p&gt;ادامه دارد …&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-4727777246669483505?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/qeAp8fCzKYs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/4727777246669483505/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/12/what-is-liskov-substitution-principle.html#comment-form" title="2 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4727777246669483505?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4727777246669483505?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/qeAp8fCzKYs/what-is-liskov-substitution-principle.html" title="اصل Liskov Substitution چيست؟" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/12/what-is-liskov-substitution-principle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANRXY7eCp7ImA9WhRQGEs.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-4411262638452001102</id><published>2011-12-14T16:29:00.001+03:30</published><updated>2011-12-14T16:33:14.800+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-14T16:33:14.800+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>اصل Open Closed چيست؟</title><content type="html">&lt;p&gt;در سري پست هاي تعريف اصول SOLID&amp;#160; با &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html" target="_blank"&gt;اصل Single Responsibility&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;آشنا شديم در اين پست دومين اصل يعني Open Closed رو برسي ميكنيم.    &lt;br /&gt;اين اصل ميگه يك كلاس بايد براي توسعه باز و براي تغيير بسته باشه بنابراين طراحي شما بايد به گونه ي باشه كه براي اضافه كردن يك قابليت جديد به كلاستون حداقل تغيير ممكن رو تو كلاستون داشته باشيد.در واقع بايد براي اضافه كردن قابليت جديد از كلاس جديد استفاده كنيم چون فرض شده تغيير تو كلاسي كه قبلا ساخته شده و داره ازش استفاده ميشه منجر به نتايج ناخواسته (باگ و…) در استفاده كننده هاي اين كلاس (مثلا يك كلاس ديگر) ميشه.     &lt;br /&gt;ابهامات احتمالي&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;كلاسي كه نبايد تغيير كنه پس نياز به تست واحد هم نداره؟ &lt;/li&gt;    &lt;li&gt;اگه كلاس باگ داشت چي(نياز به تغيير)؟ &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;جواب بعضي از اين ابهامات &lt;a href="http://stackoverflow.com/questions/1416476/is-the-open-closed-principle-a-good-idea" target="_blank"&gt;+&lt;/a&gt; و &lt;a href="http://stackoverflow.com/questions/7904042/how-do-test-driven-development-and-the-open-closed-principle-work-together" target="_blank"&gt;+&lt;/a&gt; (شايد نادرست)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;حتي اگه شما اصل Open Closed رو رعايت كرده باشيد امكانش هست سهوا يك كلاس رو تغيير بديد پس تست واحد رو داشته باشد! &lt;/li&gt;    &lt;li&gt;كلاسي كه براي اولين بار طراحي شده براي صحت عملكرد بايد تست بشه پس شما تست واحد رو از قبل داريد(توجيه خوبي براي اولين ابهام) &lt;/li&gt;    &lt;li&gt;مورد استفاده اين اصل بيشتر در مواقعي است كه استفاده كننده ي كلاس شما نيستيد مثلا طراحي API. &lt;/li&gt;    &lt;li&gt;اي اصل براي كلاس ي هست كه در حال استفاده شدنه نه كلاسي كه در مرحله طراحي و تست اون هستم و در نتيجه اضافه كردن قابليت و تغييرات داخلش بديهي هست. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;و اما برای &lt;a href="http://joelabrahamsson.com/entry/the-open-closed-principle-a-real-world-example"&gt;مثال&lt;/a&gt; عملی فرض کنید میخواهیم کلاسی (كنترلر MVC) تعریف کنیم که کاربر بتونه براي بلاگ كامنت ارسال كنه البته قبلش اطمينان حاصل بشه كه كاربر Bot نيست و از ارسال اسپم جلوگيري كنيم.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;public class EntryController
{
    public void AddComment()
    {
        if(ValidateNotSpam())
        {
             //ذخيره در بانك
        }
    }
    
    private bool ValidateNotSpam(string comment)
    {
        //چك كردن اينكه آي پي كاربر پست كننده در ليست سياده سرويس دهنده ي مربوطه نباشه
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;اولين اصلي كه اين كد نقض كرده &lt;a href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html"&gt;Single responsibility&lt;/a&gt; هست كار اين كلاس هم ارسال كامنت و هم چك كردن اسپمر نبودن كاربره و…&amp;#160; &lt;br /&gt;در اين كلاس براي راحتي كار از CAPTCHA استفاده نشده و از سرويسي كه سايت Project Honey Pot ارئه داده (چك كردن اسمپر نبودن كاربران) استفاده شده فرض كنيد ميخواهيم علاوه بر سرويس حاضر از سرويس ديگري مثلا سايت Akismet هم استفاده كنيم چه بايد كرد … 

  &lt;br /&gt;با توجه به كلاس بالا يك راه داريم &lt;strong&gt;&lt;font size="2"&gt;تغيير&lt;/font&gt;&lt;/strong&gt;&amp;#160; &lt;br /&gt;و به اين ترتيب اصل Open Closed رو هم نقض كرديم. 

  &lt;br /&gt;و اما راه حل درست (رعايت كردن اصل Open Closed) 

  &lt;br /&gt;با تعريف اينترفيس كا رو شروع ميكينم&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public interface ICommentValidator
{
    bool Validate(string authorIP, string content);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;در سازنده كلاسمون آرايه اي از ICommentValidator رو ميگيريم&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class EntryController : Controller 
{
    private ICommentValidator[] _commentValidators;

    public EntryController(ICommentValidator[] commentValidators)
    {
        _commentValidators = commentValidators;
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;متد ValidateNotSpam رو هم تغيير ميديم كه متد Validate تمام اعضاي آرايه ي ورودي رو فراخواني ميكنه&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class EntryController
{
    private bool ValidateNotSpam(string comment)
    {
        foreach (ICommentValidator validator in _commentValidators)
        {
            if (!validator.Validate(Request.ServerVariables[&amp;quot;REMOTE_ADDR&amp;quot;], comment))
                return false;
        }

        return true;
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;آخرين كاري هم كه بايد انجام بديم اينه كه به ازاي هر سرويس دهندي مود نظرمون يك كلاسي كه اينترفيس ICommentValidator رو پياده سازي كرده داشته باشيم(در اينجا Project Honey Pot وAkismet) &lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class ProjectHoneyPotCommentValidator : ICommentValidator
{
    public bool Validate(string authorIP, string content)
    {
        //چك كردن اينكه آي پي كاربر پست كننده در ليست سياده سرويس دهنده ي مربوطه نباشه
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;و اين يعني &lt;strong&gt;باز بودن براي توسعه&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ادامه دارد …&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-4411262638452001102?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/SWp869A-Q1s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/4411262638452001102/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4411262638452001102?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4411262638452001102?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/SWp869A-Q1s/what-is-open-closed-principle.html" title="اصل Open Closed چيست؟" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/12/what-is-open-closed-principle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UNSHo8cCp7ImA9WhRQF08.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-9106401185209163850</id><published>2011-12-12T23:44:00.001+03:30</published><updated>2011-12-12T23:51:39.478+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-12T23:51:39.478+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>اصل Single Responsibility چیست؟</title><content type="html">&lt;p&gt;تو دنیای برنامه نویسی و البته شیء گرایی SOLID مجموعه ی از 5 قاعده (اصل) ابتدایی شامل&lt;/p&gt;  &lt;ul dir="ltr"&gt;   &lt;li&gt;&lt;b&gt;Single responsibility&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;b&gt;Open-closed&lt;/b&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;b&gt;Liskov substitution&lt;/b&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;b&gt;Interface segregation&lt;/b&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;b&gt;Dependency inversion&lt;/b&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p dir="rtl"&gt;هست و توسط رابرت مارتین در اوایل سال 2000 معرفی شده و&lt;a href="http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29" target="_blank"&gt;…&lt;/a&gt;     &lt;br /&gt;شاید اکثرا با تعاریف این اصول آشنا باشین (درست یا غلط)&amp;#160; ولی بشخصه زیاد با مثال های که تو تاپیک های از این دست زده میشه مشکل دارم(انواع و اقسام اشکال هندسی)&amp;#160; &lt;br /&gt;قصد دارم این اصول رو با مثال های نزدیکتر با دنیای واقعی شرح بدم منظور مثال های از برنامه های تجاری(البته اگه پیدا کنم)     &lt;br /&gt;&lt;strong&gt;قبل از شروع از اساتید و دوستانی که (شاید) این پست رو میبینن درخواست میکنم در صورت خطا (برداشت غلط و…) تو مطالب و مثال های ارائه شده منو راهنمایی کنن.&lt;/strong&gt;&lt;/p&gt;  &lt;p dir="rtl"&gt;&lt;strong&gt;اصل Single responsibility&lt;/strong&gt;     &lt;br /&gt;تعریف کردن این اصل خیلی راحته ولی انجامش در عمل سخته و تقریبا میشه گفت مثل امنیت همیشه %100 نیست.     &lt;br /&gt;این اصل میگه هر کلاس فقط باید یک مسئوليت داشته و همچنیا میگه هر کلاس باید یک دلیل برای تغییر داشته باشه همونطور که گفتم راحت تعریف میشه ولی انجام و پیاده سازی درستش تقریبا سخته.     &lt;br /&gt;در صورتی که این اصل خوب انجام بشه فواید زیر رو برای ما داره&lt;/p&gt;  &lt;ul dir="rtl"&gt;   &lt;li&gt;     &lt;div&gt;پیچیدگی کلاس ها کم میشه&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;خوانایی کلاس بالا میره&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Coupling رو کم میکنه&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;کلاس ها راحتر تست میشن&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;قابلیت استفاده مجدد کدها افزایش پیدا میکنه&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;و…    &lt;br /&gt;با توجه به اون تعریف اولیه که هر کلاس یه مسئوليت داشته باشه من کلاس Customer رو که شامل متدهای Print و Save و CalculateSalary باشه رو ناقض اصل Single responsibility نمیدوم چون میگم مسئوليت این کلاس انجام کارهای مشتریه ولی یه قسمت دیگه ی تعریف میگه هر کلاس باید یک دلیل برای تغییر داشته باشه به تغییرات احتمالی کلاس&amp;#160; Customer توجه کنید&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;درصد مالیات تو متد CalculateSalary بالا بره &lt;/li&gt;    &lt;li&gt;متد Save بجای &lt;a href="http://www.dotnetdev.info/search/label/Sql%20Server"&gt;Sql Server &lt;/a&gt;روی Oracle انجام بشه &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;و…    &lt;br /&gt;نتیجه n دلیل برای تغییر تو این کلاس داریم پس برای رعایت SRP میایم کلاس های CustomerPrinter و CustomerSaver و CustomerSalaryCalculator رو تعریف میکنیم.     &lt;br /&gt;و اما برای &lt;a href="http://blog.sanaulla.info/2011/11/16/solid-single-responsibility-principle/" target="_blank"&gt;مثال&lt;/a&gt; عملی فرض کنید میخواهیم کلاسی تعریف کنیم که کاربر بتونه تنظیمات برنامه رو باهاش عوض کنه البته قبلش کاربر احراز هویت بشه.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush:csharp"&gt;public class UserSettingService
{
  public void changeEmail(User user)
  {
	if(checkAccess(user))
	{
	   //دادن اجازه ی تغییر
	}
  }
  public boolean checkAccess(User user)
  {
	//برسی معتبر بودن کاربر
  }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;این کلاس 2 تا مسئوليت داره 1-احراز هویت 2-تغییر تنظیمات برنامه 
  &lt;br /&gt;این کلاس چندین دلیل برا تغییر داره 1-عوض کردن روش احراز هویت شدن 2-عوض کردن مثلا روش تائید عوض کردن ایمیل و…&lt;/p&gt;

&lt;p&gt;برای رعایت کردن اصل SRP تو این مثال کد &lt;a href="http://www.dotnetdev.info/search/label/Refactoring" target="_blank"&gt;Refactor&lt;/a&gt; شده به شکل زیر میشه&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt;public class UserSettingService
{
  public void changeEmail(User user)
  {
	if(SecurityService.checkAccess(user))
	{
	   	   //دادن اجازه ی تغییر
	}
  }
}
public class SecurityService
{
  public static boolean checkAccess(User user)
  {
	//برسی کردن دسترسی
  }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;در واقع با تجزیه کردن کلاس UserSettingService به دو کلاسUserSettingService و SecurityService ما کلاس های داریم که تنها یک مسئوليت دارن. 
  &lt;br /&gt;در آخر ذکر این نکته مهمه که برا فراگیری درست این اصول و کلا برنامه نویسی نگاه کردن به کد دیگران الزامیه همنطور که جناب Scott Hanselman ذکر کردن&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p dir="ltr"&gt;Reading to Be a Better Developer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;پس خوندن (نه کپی پیست کردن) چیز مهمیه که خالق &lt;a href="http://www.dotnetdev.info/search/label/ASP.NET%20MVC"&gt;ASP.NET MVC&lt;/a&gt; (البته یکی از اونا) میگه من کد دیگرون رو میخونم و.. 

  &lt;br /&gt;برای درک SRP و خیلی چیزهای دیگه میتونید پروژه های کد باز جناب نصیری &lt;a href="http://subtitletools.codeplex.com/" target="_blank"&gt;SubtitleTools&lt;/a&gt; و &lt;a href="http://bap.codeplex.com/" target="_blank"&gt;Blogger auto poster&lt;/a&gt; رو ببینید&lt;/p&gt;

&lt;p&gt;ادامه دارد …&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-9106401185209163850?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/l2qfv52FVBA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/9106401185209163850/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html#comment-form" title="7 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/9106401185209163850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/9106401185209163850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/l2qfv52FVBA/what-is-single-responsibility-principle.html" title="اصل Single Responsibility چیست؟" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>7</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/12/what-is-single-responsibility-principle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4BQngyfyp7ImA9WhRREk4.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-2749751752406428205</id><published>2011-11-25T19:21:00.001+03:30</published><updated>2011-11-25T19:32:33.697+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-25T19:32:33.697+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>الگوهای ابتدایی برای برنامه نویسی دات نت</title><content type="html">&lt;p&gt;در این &lt;a href="http://laktek.com/2011/11/23/basic-patterns-for-everyday-programming/"&gt;پست&lt;/a&gt; چند الگوی شاید معمولی ولی بسیار مهم لیست شده.مطلب جالبیه تنها مشکلش اینه که مثال های اون به هر زبانی هست جز #C.     &lt;br /&gt;تو این پست معادل های دات نت ی اون لیست شده.     &lt;br /&gt;&lt;strong&gt;1-ارزیابی موجود بودن یک شی (null نبودن) قبل از فراخوانی متدها و خواص های اون      &lt;br /&gt;&lt;/strong&gt;تکنیکی به نام “andand” وجود داره که طی اون هنگام فراخوانی مثلا یک متد یک شی نام اون شی رو با فراخوانی متدش AND منطقی میکنیم و این باعث میشه تنها در صورتی که شی ما موجود باشه (null نباشه) متد مربوطه فراخوانی شه.     &lt;br /&gt;به این مثال تو زبان JavaScript توجه کنید&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: javascript"&gt;var parsed_content = window.JSON &amp;amp;&amp;amp; window.JSON.parse(&amp;quot;{}&amp;quot;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;تا جایی که من میدونم و سرچ هم کردم چنین ویژگی تو #C موجو نیست. 
  &lt;br /&gt;و اما این کار رو به روش های دیگه ی میشه انجام داد مثلا با یه IF قبلش چک کنیم شی ما null نباشه تنها مشکلش اینه که در صورتی که شی ما تو در تو باشه تعداد IF های ما زیاد میشه.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt;const string xmlDoc =
               @&amp;quot;
                &amp;lt;opml version=&amp;quot;&amp;quot;1.0&amp;quot;&amp;quot;&amp;gt;
                &amp;lt;head&amp;gt;
                    &amp;lt;title&amp;gt;Mohammad subscriptions in Google Reader&amp;lt;/title&amp;gt;
                &amp;lt;/head&amp;gt;
                &amp;lt;/opml&amp;gt;&amp;quot;;

XDocument xDocument = XDocument.Parse(xmlDoc);
var xElement = xDocument.Element(&amp;quot;opml&amp;quot;);
if (xElement != null)
{
    var element = xElement.Element(&amp;quot;head&amp;quot;);
    if (element != null)
    {
        var xElement1 = element.Element(&amp;quot;title&amp;quot;);
        if (xElement1 != null)
        {
            var headXElement = xElement1.Value;
        }

    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;خیلی زشته…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2-استفاده از مقادیر پیش فرض در هنگام تخصیص به یک متغییر(در صورت نامعتبر بودن مقدار تخصیصی) 
    &lt;br /&gt;&lt;/strong&gt;با این کار شما از شر مشکلات احتمالی ناشی از&amp;#160; مقادیر null و نامعتبر در ادامه برنامه راحت میشید تقریبا کاری که در &lt;a href="http://www.dotnetdev.info/search/label/Linq"&gt;Linq&lt;/a&gt; داریم OrDefault ها.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt;var headXElement = string.IsNullOrWhiteSpace(xElement1.Value)
                                               ? &amp;quot;YOURNAME subscriptions in Google Reader&amp;quot;
                                               : xElement1.Value;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;در کد بالا در صورتی که تگ title ما خالی باشه از مقدار پیش فرض YOURNAME استفاده میکنیم.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3-مقایسه کردن برابری یکه متغییر با چندین مقدار معین 
    &lt;br /&gt;&lt;/strong&gt;فرض کنید متغیری بنام currentDay دارید میخواهید چک کنید ببینید currentDay روز زوج هست. 

  &lt;br /&gt;&lt;strong&gt;شاید&lt;/strong&gt; اولین روشی که انجام بدیم کد زیر باشه&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt;if (currentDay == &amp;quot;شنبه&amp;quot; || currentDay == &amp;quot;دوشنبه&amp;quot; || currentDay == &amp;quot;چهارشنبه&amp;quot;)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;بهتره اون مقادیر رو تو لیستی (آرایه) داشته باشیم و currentDay رو داخل اون چک کنیم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt; var evenDays = new List&lt;string&gt; { &amp;quot;شنبه&amp;quot;, &amp;quot;دوشنبه&amp;quot;, &amp;quot;چهارشنبه&amp;quot; };
 if (evenDays.Contains(currentDay))
  {
     var isEven = true;
  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4-شرط های پیچده و تکرارشونده رو به متد تبدیل کنید 
    &lt;br /&gt;&lt;/strong&gt;این نکته تو سری پست های جناب نصیری در رابطه با Refactoring برسی شده(البته با روشی متفاوت) 

  &lt;br /&gt;&lt;a href="http://www.dotnettips.info/2011/10/refactoring-11.html"&gt;شرط‌هاي تركيبي را كپسوله كنيد&lt;/a&gt; 

  &lt;br /&gt;در واقع هدف بالا بردن خوانایی کد هست&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5-حفظ کردن نتیجه ی متدهای تکرارشونده 
    &lt;br /&gt;&lt;/strong&gt;یکی از مزیت های تبدیل شرط های پیچیده در قالب یک متد استفاده از نتیجه ی اون تو فراخوانی های بعدی هستش.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush:csharp"&gt;readonly Dictionary&lt;string bool ,&gt; _validDays = new Dictionary&lt;string bool ,&gt;();
private bool IsValidDay(string day)
{
    bool lookup;
    if (_validDays.TryGetValue(day, out lookup))
        return lookup;
            
    //lookup=خروجی یک محاسبه پیچیده و گرفتن دیتا از سرور های ناسا

    _validDays[day] = lookup;
    return lookup;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;مثلا تو کد بالا ما میایم نتیجه فراخوانی های قبلی رو تو یک دیکشنری ذخیره میکنیم و در متد قبل از انجام محاسبات دیکشنری رو جستجو میکنیم اگه پارامتر ورودی متد در Key های اون دیکشنری بود Value ش رو برمیگردونیم.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-2749751752406428205?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/aUr1OO9PPA8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/2749751752406428205/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/11/basic-patterns-for-dotnet-programming.html#comment-form" title="6 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/2749751752406428205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/2749751752406428205?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/aUr1OO9PPA8/basic-patterns-for-dotnet-programming.html" title="الگوهای ابتدایی برای برنامه نویسی دات نت" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/11/basic-patterns-for-dotnet-programming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BRH07fCp7ImA9WhRSEU8.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-880743183230665283</id><published>2011-11-12T23:59:00.001+03:30</published><updated>2011-11-13T00:00:55.304+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-13T00:00:55.304+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RavenDB" /><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC" /><title>مقدمه ای بر RavenDB – قسمت سوم</title><content type="html">&lt;p&gt;در دو قسمت &lt;a href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part1.html"&gt;اول&lt;/a&gt; و &lt;a href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part2.html"&gt;دوم&lt;/a&gt; “مقدمه ای به RavenDB” به آشنایی با مقدمات RavenDB پرداختیم تو این قسمت میخواهیم با یک مثال در عمل با RavenDB آشنا بشیم.     &lt;br /&gt;برای شروع یک پروژه ASP.NET MVC 3 رو ایجاد میکنیم.     &lt;br /&gt;اگه از قسمت اول یادتون باشه گفتم یکی از 4 روش راه اندازی (هاست کردن) RavenDB به صورت مدفون شده یا Embed هست برای استفاده از این روش کافیه پکیج RavenDB-Embedded رو با &lt;a href="http://www.dotnettips.info/search/label/NuGet"&gt;NuGet&lt;/a&gt; نصب کنیم.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Embedde_Install.png" /&gt;همونطور که قبلا گفتم RavenDB به صورت schema-less هست ازاینرو برای کار با بانک نیاز نیست شما بانک و جدولی رو از قبل بسازید (کاری که با بانک های Embedded دیگه مثله SQL Server Compact انجام میدیم) تنها پس از اولین فراخوانی متد initialize شی DocumentStore ما فایل های مربوطه (همان بانک RavenDB) ساخته میشه.     &lt;br /&gt;برای ذخیره بانک ما از پوشه استاندارد App_Data استفاده میکنیم.     &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Project_Structure.png" /&gt;در طول چرخه حیاط یک برنامه بایستی یکه وهله از بانک در دسترس باشه ازاینرو از الگوی Singleton استفاده میکنیم.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;public class DataDocumentStore
{
	private static IDocumentStore _instance;
	public static IDocumentStore Instance
	{
		get
		{
			if (_instance == null)
				throw new InvalidOperationException(&amp;quot;IDocumentStore has not been initialized.&amp;quot;);
			return _instance;
		}
	}

	public static IDocumentStore Initialize()
	{
		_instance = new EmbeddableDocumentStore { ConnectionStringName = &amp;quot;RavenDB&amp;quot; };
		_instance.Conventions.IdentityPartsSeparator = &amp;quot;-&amp;quot;;
		_instance.Initialize();
		return _instance;
	}
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;تنها نکته ی که تو کد بالا باید اشاره کرد قسمت ست کردن IdentityPartsSeparator هست همونطور که تو قسمت های قبل اشاره شد RavenDB برای ذخیره کردن سند از فرمت EntityName/ID استفاده میکنه مثلا Albums/20 خب مشکل اینه که / تو سیستم مسیریابی MVC باعث مشکل میشه ازاینرو ما با ست کردن IdentityPartsSeparator به جای /&amp;#160; از – استفاده میکنیم مثلا Albums-20. 
  &lt;br /&gt;برای اینکه در اولین اجرای برنامه بانک ما ساخته بشه فراخوانی متد Initialize رو تو متد Application_Start انجام میدیم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            DataAccess.DataDocumentStore.Initialize();
        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;تا اینجای کار ما موفق شدیم شی DocumentStore رو برای کار تو برنامه بسازیم و اطمینان حاصل کنیم تنها یک وهله از شی DocumentStore داخل برنامه استفاده بشه. &lt;/p&gt;

&lt;p&gt;کار رو با تعریف کردن کلاس (مدل) Person ادامه میدیم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt; public class Person
    {
        public string Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
	
	&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;API های RavenDB برای کار با بانک از الگوی Unit of Work استفاده میکنند دقیقا روشی که با data context در Entity Framework انجام میدیم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;using (var session = documentStore.OpenSession())
{
  session.Store(Person);
  session.SaveChanges();
}
	&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;این روش خوب و بهینه ای هست که یک session رو سراسر یک درخواست HTTP باز نگه داریم ازاینروز میایم یه کنترلر پایه (Base) میسازیم که در شروع یک Action بیاد session رو باز کنه و بعد از اجرا شدن Action تغییرات رو تو بانک اعمال و session رو ببنده و در کنترلرهای دیگه این کنترلر رو به ارث ببریم.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class BaseDocumentStoreController : Controller
    {
        public IDocumentSession DocumentSession { get; set; }

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.IsChildAction)
                return;
            this.DocumentSession = DataDocumentStore.Instance.OpenSession();
            base.OnActionExecuting(filterContext);
        }

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.IsChildAction)
                return;

            if (this.DocumentSession != null &amp;amp;&amp;amp; filterContext.Exception == null)
                this.DocumentSession.SaveChanges();

            var documentSession = this.DocumentSession;
            if (documentSession != null) documentSession.Dispose();

            base.OnActionExecuted(filterContext);
        }
    }
	
	&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;در آخر نحوه انجام چهار عملی اصلی (CRUD) رو در بانک RavenDB میبینیم در کنترلر مربوطه.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public class PersonController : BaseDocumentStoreController
    {
        //
        // GET: /Person/

        public ViewResult Index()
        {
            var model = this.DocumentSession.Query&lt;person&gt;().ToList();
            return View(model);
        }

        public ActionResult Edit(string id)
        {
            var model = DocumentSession.Load&lt;person&gt;(id);
            return View(model);
        }

        [HttpPost]
        public ActionResult Edit(Person person)
        {
            this.DocumentSession.Store(person);
            return RedirectToAction(&amp;quot;Index&amp;quot;);
        }

        public ActionResult Create()
        {
            var model = new Person();
            return View(model);
        }

        [HttpPost]
        public ActionResult Create(Person person)
        {
            DocumentSession.Store(person);
            return RedirectToAction(&amp;quot;Index&amp;quot;);
        }

        public ActionResult Delete(string id)
        {
            var model = DocumentSession.Load&lt;person&gt;(id);
            return View(model);
        }

        [HttpPost,ActionName(&amp;quot;Delete&amp;quot;)]
        public ActionResult DeleteConfirmed(string id)
        {
            DocumentSession.Advanced.DatabaseCommands.Delete(id,null);
            return RedirectToAction(&amp;quot;Index&amp;quot;);
        }
    }
	&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;خروجی متد IDocumentSession.Query از نوع IRavenQueryable هست که اینترفیس IEnumerable رو محقق (پیاده سازی) کرده ازاینرو میشه متد ToList رو براش فراخوانی کرد. 
  &lt;br /&gt;متد IDocumentSession.Load براساس پارامتر وردیش (کلید سند) سند مورد نظر رو بازیابی میکنه. 

  &lt;br /&gt;متد IDocumentSession.Store هم کار ایجاد رو انجام میده و هم کار آپدیت و بروز رسانی یک سند موجود رو حالا سوالی که پیش میاد اینه که چجوری تشخیص میده که باید آپدیت کنه یا ایجاد؟ 

  &lt;br /&gt;اگه پارامتر ورودی متد Store (در اینجا Person) مقدار Id ش ست شده باشه میره و براساس اون Id سند مورد نظر رو آپدیت میکنه در غیر اینصورت به بانک اضافش میکنه و یک Id بهش اختصاص میده. 

  &lt;br /&gt;برای پاک کردن از 2 راه میشه اینکارو انجام داد &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;فراخوانی متد IDocumentSession.Delete که لازمه قبلش سند مورد نظر رو لود کنیم و بعنوان ورودی این متد بدیم. &lt;/li&gt;

  &lt;li&gt;استفاده از DocumentSession.Advanced.DatabaseCommands.Delete که بدون لود کرد سند مورد نظر و با داشتن Id سند مورد نظر مستقیم اونو پاک کنیم. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;نمای از صفحه اصلی برنامه&lt;/p&gt;

&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Project_Final_Result_List.png" /&gt;&lt;/p&gt;

&lt;p&gt;منابع:&lt;a href="http://blog.hibernatingrhinos.com/5/ravendb-in-practice-part-1-an-introduction-to-ravendb"&gt;+&lt;/a&gt;و&lt;a href="http://ravendb.net/tutorials"&gt;+&lt;/a&gt;و&lt;a href="http://msdn.microsoft.com/en-us/magazine/hh547101.aspx"&gt;+&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-880743183230665283?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/YsrbpQwh6GQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/880743183230665283/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/880743183230665283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/880743183230665283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/YsrbpQwh6GQ/introduction-to-ravendb-part.html" title="مقدمه ای بر RavenDB – قسمت سوم" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ASHs5eCp7ImA9WhRTGUw.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-1595750056791343848</id><published>2011-11-10T11:10:00.001+03:30</published><updated>2011-11-10T11:10:49.520+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T11:10:49.520+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RavenDB" /><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL" /><title>مقدمه ای بر RavenDB – قسمت دوم</title><content type="html">&lt;p&gt;در پست &lt;a href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part1.html"&gt;قبلی&lt;/a&gt; با استفاده از Management Studio دیتای تستی ساختیم. حالا یه شرح مختصری از سند و مجموعه    &lt;br /&gt;سند (&lt;b&gt;document&lt;/b&gt;) چیست؟    &lt;br /&gt;سند در واقع یک شی JSON هست و معادل یک ردیف (رکورد) تو بانک های رابطه ای RDBMS محسوب میشه برای آشنایی بیشتر با ساختار سند روی یکی از سند های ایجاد شده کلیک و دکمه Edit رو بزنید.    &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Doc_Details.png" /&gt;    &lt;br /&gt;همونطور که تو شکل میبینید یکه سند شامل یک کلید , دیتا و متا دیتا هست.    &lt;br /&gt;کلید (تو این شکل albums/20) رو میشه با PK یا کلید اصلی تو بانک های رابطه ای RDBMS قیاس کرد.    &lt;br /&gt;دیتا در واقع کل شی(در اینجا آلبوم) شما در فرمت JSON هستش.    &lt;br /&gt;متا دیتا هم بصورت اتومات ایجاد میشه مثلا در این شکل Raven-Clr-Type یکه شی دات نت ی هست که به سند ما مپ شده.    &lt;br /&gt;Raven برای اختصاص کلید به هر سند از روش guid ترتیبی (sequential guid) استفاده میکنه که هم بصورت جهانی یکتا هست و هم با توجه به ترتیبی بودن به خوبی ایندکس میشه البته توجه کنید برای اختصاص کلید به یک سند میشه کلید رو به صورت صریح مشخص کرد و هم کلید رو به صورت Identity key اختصاص داد.خود Raven بصورت داخلی از Identity key پشتیبانی میکنه(تو پست های بعدی بیشتر توضیح میدم)    &lt;br /&gt;سند ها با فرمت زیر قابل دسترسی هستن&lt;/p&gt;  &lt;p dir="ltr"&gt;&lt;a title="http://localhost:8080/docs/{document_id}" href="http://localhost:8080/docs/{document_id}"&gt;http://localhost:8080/docs/{document_id}&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;مجموعه (&lt;b&gt;collection&lt;/b&gt;) چیست؟    &lt;br /&gt;مجموعه در واقع لیستی از سند ها هستن که بر اساس یک موجودیت Raven ی(Raven-Entity-Name) دسته بندی شدن این مقدار تو متا دیتای سند موجوده مثلا تو این مثال موجودیت های Raven ی ما Albums و Genres هست.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Collections_Details.png" /&gt;    &lt;br /&gt;استفاده اصلی مجموعه ها تو ایندکس گذاری هست و مثلا وقتی شما سندی رو کوئری میزنید اون سند بر اساس مجموعش از بین تمام سند ها انتخاب میشه.    &lt;br /&gt;از دید بانک مجموعه ها یک سری سند هستن که نام موجودیت (entity name) اونا یکی هست.&lt;/p&gt;  &lt;p&gt;ادامه دارد…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-1595750056791343848?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/_UKOnAp9VVk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/1595750056791343848/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part2.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1595750056791343848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1595750056791343848?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/_UKOnAp9VVk/introduction-to-ravendb-part2.html" title="مقدمه ای بر RavenDB – قسمت دوم" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAHSXY6cCp7ImA9WhRTGEo.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-5123083939604012673</id><published>2011-11-09T23:55:00.001+03:30</published><updated>2011-11-10T00:02:18.818+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T00:02:18.818+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RavenDB" /><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL" /><title>مقدمه ای بر RavenDB – قسمت اول</title><content type="html">&lt;p&gt;بانک اطلاعاتی RavenDB یک بانک اطلاعاتی سندگرا ی متن باز برای پلتفرم دات نت / ویندوز هست که هر سند رو تو فرمت JSON ذخیره میکنه.تو بانک اطلاعاتی سندگرا هر موجودیت (Entity) میتونه بعنوان یک سند ذخیره بشه.   &lt;br /&gt;این بانک ها اصطلاحا schema-less هستن یعنی نیازی نیست شما برای ذخیره کردن موجودیت مورد نظرت (مثلا کالا) بری اسکیمای اونو تو بانکت تعریف کنی کاری که ما تو RDBMS ها انجام میدیم و برای مثلا کالا جدولی شامل شماره کالا , نام کالا ,نوع کالا و… تعریف میکنیم.    &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_1.png" /&gt;    &lt;br /&gt;RavenDB جزء بانک های NoSQL است.    &lt;br /&gt; NoSQL چیست؟&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;برای تعریف NoSQL، من فکر می کنم بهتره از این حیث بررسی کنیم که NoSQL چه چیزی نیست؟ یعنی یه جورایی از فرض خلف به مفهومش برسیم. این تکنولوژی، SQL نیست و بصورت رابطه ای هم نیست. همانطور که از نامش پیداست جایگزینی برای مدیریت بانک های اطلاعاتی رابطه ای (RDBMS)&amp;#160; هم نیست، اما آنرا پیاده سازی می کند! NoSQL برای ذخیره سازی داده ها بصورت توزیع شده، جایی که حجم داده های ما در مقیاس بالا باشد، وارد میدان می شود&lt;a href="http://overtcode.com/archives/nosql/"&gt;…&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt; استفاده از بانک اطلاعاتی RavenDB چه منفعتی برای ما داره؟&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;کارایی بهتر تو نرم افزار هامون&lt;/li&gt;    &lt;li&gt;تسریع سرعت توسعه نرم افزار&lt;/li&gt;    &lt;li&gt;نگهداری بهتر سیستم&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;برای استفاده از بانک اطلاعاتی RavenDB میتونید آخرین نسخه اونو از &lt;a href="http://builds.hibernatingrhinos.com/downloadlatest/ravendb"&gt;اینجا&lt;/a&gt; دانلود کنید.    &lt;br /&gt;سرور RavenDB رو به 4 روش میشه راه اندازی کرد&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;برنامه کنسول که بصورت دیفالت و برای دیباگ و آزمایش کردن استفاده میشه.&lt;/li&gt;    &lt;li&gt;بعنوان یک سرویس ویندوزی.&lt;/li&gt;    &lt;li&gt;بعنوان یک وب سایت IIS (هاست شدن تو IIS).این بهترین روش برای محیط عملیاتی محسوب میشه&lt;/li&gt;    &lt;li&gt;به حالت جاسازی / مدفون شده (embed) تو نرم افزار.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;برای شروع ما از حالت اول استفاده میکنیم کافیه Start.cmd رو اجرا کنیم تا همه چیز بصورت اتومات اجرا بشه.   &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_Start.jpg" /&gt;    &lt;br /&gt;بعد از اینکار محیط Management Studio ی RavenDB تو آدرس &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; باز میشه محیطی زیبا که با Silverlight طراحی شده.    &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_MS.jpg" /&gt;    &lt;br /&gt;در ابتدای کار بانکی بصورت پیش فرض برای شما ساخته میشه که شامل هیچ سند و مجموعه ای (collection) نیست(جلوتر توضیح میدم) برای اینکه تو بانکمون دیتای تستی بسازیم روی دکمه Create sample data کلیک میکنیم.    &lt;br /&gt;توجه:با توجه به اینکه RavenDB به صورت پیش فرض اجازه دسترسی بی نام (anonymous) رو فقط برای درخواست های خوندن میده (HTTP GET)&amp;#160; برای اجرا شدن دستور بالا باید نام کاربری و رمز عبور خودتون رو وارد کند.    &lt;br /&gt;دیتای تستی شامل 256 تا سند و 2 تا مجموعه و 5 تا ایندکسه و…    &lt;br /&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/RavenDB_MS_GenerateData.jpg" /&gt;    &lt;br /&gt;ادامه دارد…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-5123083939604012673?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/5ylwTqsKhDU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/5123083939604012673/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part1.html#comment-form" title="1 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5123083939604012673?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5123083939604012673?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/5ylwTqsKhDU/introduction-to-ravendb-part1.html" title="مقدمه ای بر RavenDB – قسمت اول" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/11/introduction-to-ravendb-part1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUDRHk5fip7ImA9WhdaFU8.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-2857760921412227176</id><published>2011-10-25T00:52:00.001+03:30</published><updated>2011-10-25T09:27:55.726+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-25T09:27:55.726+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVVM" /><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="OPMLtools" /><title>Drag و Drop کردن در الگوی MVVM</title><content type="html">&lt;p&gt;برای اضافه کردن یه قابلیت جدید به برنامه ي &lt;a href="http://www.dotnetdev.info/2011/10/opmltools.html"&gt;OPMLtools&lt;/a&gt; نیاز به Drag&amp;amp;Drop داشتم.     &lt;br /&gt;برای انجام Drag&amp;amp;Drop تو حالت &lt;a href="http://www.wpftutorial.net/DragAndDrop.html"&gt;عادی&lt;/a&gt; تقریبا کار سختی نداریم ولی وقتی Drag&amp;amp;Drop رو تو MVVM بخوایم کار سخت میشه و…     &lt;br /&gt;بعد جستجو به فریمورک متن باز &lt;a href="http://code.google.com/p/gong-wpf-dragdrop/"&gt;GongSolutions&lt;/a&gt; رسیدم که کار Drag&amp;amp;Drop رو تو MVVM خیلی ساده میکنه.     &lt;br /&gt;برای دانلود dll مربوطه میتونید از این &lt;a href="http://www.dotnettips.info/2011/05/clone.html"&gt;روش&lt;/a&gt; کمک بگیرید یا از &lt;a href="https://dotnetdevrepository.svn.codeplex.com/svn/PostContents/GongSolutions.Wpf.DragDrop.rar"&gt;اینجا&lt;/a&gt; دانلود کنید.     &lt;br /&gt;و اما نحوه استفاده &lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: xml"&gt;&lt;treeview dnd:dragdrop.drophandler="{Binding}" dnd:dragdrop.isdroptarget="True" dnd:dragdrop.isdragsource="True" itemssource="{Binding Opmls}"&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;br /&gt;همونطور که تو کد XAML بالا میبیند نحوه اضافه کردن قابلیت Drag&amp;amp;Drop خیلی سادس ویژگی های IsDragSource و IsDropTarget همونطور که از اسمشون پیداس مشخص میکنن که آیا کنترل مورد نظر میتونه مبدا و مقصد یک عمل Drag&amp;amp;Drop باشه.   &lt;br /&gt;قسمت مهم این کد مقید کردن هندلر رخداد Drop به ViewModel ما به کمک ویژگی DropHandler هست.   &lt;br /&gt;و اما تو ViewModel بازم کار برای ما راحت شده فقط کافیه اینترفیس IDropTarget رو پیاده سازی کنیم که شامل 2 متد DragOver و Drop میشه.   &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;public void DragOver(DropInfo dropInfo)
  {
    if (dropInfo.Data is OpmlModel &amp;amp;&amp;amp; dropInfo.TargetItem is OpmlModel)
     {
       dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
       dropInfo.Effects = DragDropEffects.Move;
     }
  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;کاری که ما تو متد DragOver اینه که آیا شی مبدا و مقصد ما تو عمل Drag&amp;amp;Drop معتبر هستن یا نه اگه بودن تزیین کننده (Adorner) ی عمل Drag&amp;amp;Drop رو ست میکنیم. 
  &lt;br /&gt;ویژگی dropInfo.Data شامل دیتای هست که Drag شده و dropInfo.TargetItem هم شامل دیتای هست که ماوس روش قرار گرفته(توجه کنید منظور از دیتا ;دیتای مقید شده به کنترل مورد نظر هست مثلا در اینجا شی OpmlModel) &lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;public void Drop(DropInfo dropInfo)
  {
    var srcOpmlModel = (OpmlModel)dropInfo.Data;
    var trgOpmlModel = (OpmlModel)dropInfo.TargetItem;
    foreach (var ancestor in srcOpmlModel.Ancestors)
     {
       trgOpmlModel.Ancestors.Add(ancestor);
     }
    Opmls.Remove(srcOpmlModel);
  }&lt;/pre&gt;
&lt;/div&gt;

&lt;br /&gt;آخرین متد هم Drop هست و تمام. 


  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-2857760921412227176?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/MvW18xJcpvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/2857760921412227176/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/10/drag-and-drop-in-mvvm.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/2857760921412227176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/2857760921412227176?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/MvW18xJcpvw/drag-and-drop-in-mvvm.html" title="Drag و Drop کردن در الگوی MVVM" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/10/drag-and-drop-in-mvvm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YNQXo7eyp7ImA9WhdbFE4.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-7125881861397325087</id><published>2011-10-12T18:21:00.001+03:30</published><updated>2011-10-12T18:23:10.403+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T18:23:10.403+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sql Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><title>دي كامپايل كردن اسمبلي هاي CLR</title><content type="html">&lt;p&gt;هنگام Deploy كردن پروژه SQL CLR در SQL Server اسمبلي مربوطه در VIEW ي sys.assembly_files ذخيره ميشه.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: sql"&gt;
SELECT * FROM sys.assembly_files&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;بصورت پيش فرض براي كمك در ديباگ كردن گزينه Deploy Code فعاله و سورس كد شما هم تو ديتابيس ذخيره ميشه.خوب براي ديدن سورس اسمبلي مورد نظر كافيه اونو Cast كنيم به VARCHAR(max) و تمام.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: sql"&gt;
SELECT CAST(content AS VARCHAR(max)) FROM sys.assembly_files&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;ولي اگه گزينه Deploy Code رو غير فعال كنيم فقط Dll مربوطه تو ديتابيس ذخيره ميشه و … 
  &lt;br /&gt;براي اين مورد كافيه ما Dll رو داشته باشيم و با &lt;a href="http://www.aliaghdam.ir/search/label/.NET%20Reflectors"&gt;.NET Reflector&lt;/a&gt; به سروس برسيم. 

  &lt;br /&gt;و اما نكته اينه كه چجوري به Dll برسيم بعد سرچ به اين &lt;a href="http://thestandardoutput.com/2010/11/extracting-a-net-assembly-from-sql-server-2005/"&gt;كد&lt;/a&gt; رسيدم (CLR Procedure) كه مياد Dll ذخيره شده تو ديتابيس رو داخل ديسك ذخيره ميكنه.&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: csharp"&gt;using System;
   using System.IO;
   using System.Data;
   using System.Data.SqlClient;
   using System.Data.SqlTypes;
   using Microsoft.SqlServer.Server;
   using System.Security.Permissions;
 
   namespace ExtractSqlAssembly {
       [PermissionSet(SecurityAction.Demand, Unrestricted = true, Name = &amp;quot;FullTrust&amp;quot;)]
       public partial class SaveSqlAssembly {
 
           [SqlProcedure]
           public static void SaveAssembly(string assemblyName, string path) {
               string sql = @&amp;quot;SELECT AF.content FROM sys.assembly_files AF JOIN sys.assemblies A ON AF.assembly_id = A.assembly_id where AF.file_id = 1 AND A.name = @assemblyname&amp;quot;;
               using (SqlConnection conn = new SqlConnection(&amp;quot;context connection=true&amp;quot;)) {
                   using (SqlCommand cmd = new SqlCommand(sql, conn)) {
                       SqlParameter param = new SqlParameter(&amp;quot;@assemblyname&amp;quot;, SqlDbType.VarChar);
                       param.Value = assemblyName;
                       cmd.Parameters.Add(param);
 
                       cmd.Connection.Open();  // Read in the assembly byte stream
                       SqlDataReader reader = cmd.ExecuteReader();
                       reader.Read();
                       SqlBytes bytes = reader.GetSqlBytes(0);
 
                       // write the byte stream out to disk
                       FileStream bytestream = new FileStream(path, FileMode.CreateNew);
                       bytestream.Write(bytes.Value, 0, (int)bytes.Length);
                       bytestream.Close();
                   }
               }
           }
       }
   }&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-7125881861397325087?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/bK8iGl5T-1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/7125881861397325087/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/10/decompiling-clr-assemblies.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7125881861397325087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7125881861397325087?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/bK8iGl5T-1Y/decompiling-clr-assemblies.html" title="دي كامپايل كردن اسمبلي هاي CLR" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/10/decompiling-clr-assemblies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4BSX0zfyp7ImA9WhdbEUg.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-7937338752823139652</id><published>2011-10-09T14:10:00.001+03:30</published><updated>2011-10-09T14:12:38.387+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-09T14:12:38.387+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>برطرف كردن مشكل افزونه Regionerate در Visual Studio</title><content type="html">&lt;p&gt;بعد از نصب كردن آخرين نسخه افزونه &lt;a href="http://www.rauchy.net/regionerate/docs/2007/05/download.html"&gt;Regionerate&lt;/a&gt; هنگام اجراكردن &lt;a href="http://www.dotnetdev.info/search/label/Visual%20Studio"&gt;Visual Studio&lt;/a&gt; پيغام اروري با محتواي زير صادر ميشد.&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: plain"&gt;
A problem occured while trying to initialize menus. 
System.ArgumentException: A Command with that name already exists. 
    at EnvDTE80.Commands2.AddNamedCommand2(AddIn AddInInstance, 
  String name, String ButtonText, String Tooltip, Boolean MSOButton, 
  Object Bitmap, Object[]&amp;amp; ContextUIGUIDs, Int32 vsCommandStatusValue, 
  Int32 CommandStyleFlags, vsCommandControlType ControlType) 
    at Rauchy.Regionerate.Presentation.Addins.VisualStudio2005.Connect. 
  OnConnection(Object application, ext_ConnectMode connectMode, 
  Object addInInst, Array&amp;amp; custom) 
You may have to restart Regionerate.&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;براي رفع اين مشكل اين &lt;a href="https://dotnetdevrepository.svn.codeplex.com/svn/PostContents/Regionerate.Presentation.Addins.VisualStudio2005.dll"&gt;فايل&lt;/a&gt; رو (Regionerate.Presentation.Addins.VisualStudio2005.dll) در مسير زير كپي (Replace) كنيد.&lt;/p&gt;

&lt;p dir="ltr"&gt;C:\Program Files\Regionerate&lt;/p&gt;

&lt;p&gt;در ويندوز هاي 64 بيتي آدرس زير&lt;/p&gt;

&lt;p dir="ltr"&gt;C:\Program Files (x86)\Regionerate&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;با توجه به سورس باز بودن اين افزونه با يك تغيير جزئي تو كلاس &lt;a href="http://svn6.assembla.com/svn/Regionerate/Presentation.Addins.VisualStudio2005/Connect.cs"&gt;Connect.cs&lt;/a&gt; مشكل حل ميشه.&lt;/p&gt;

&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;a href="http://blog.benryyip.com/post/7776799561/fixing-hiding-a-bug-with-some-regioneraid"&gt;منبع&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-7937338752823139652?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/AyGXsUi-PSQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/7937338752823139652/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/10/fixing-regionerate-visual-studio-addin.html#comment-form" title="4 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7937338752823139652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7937338752823139652?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/AyGXsUi-PSQ/fixing-regionerate-visual-studio-addin.html" title="برطرف كردن مشكل افزونه Regionerate در Visual Studio" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/10/fixing-regionerate-visual-studio-addin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGRXYyeyp7ImA9WhdUGE8.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-3535752828514454338</id><published>2011-10-05T18:25:00.001+03:30</published><updated>2011-10-05T18:27:04.893+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-05T18:27:04.893+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sql Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><title>چندين نكته هنگام استفاده از تابع AVG در SQL SERVER</title><content type="html">&lt;p&gt;هنگام استفاده از تابع تجميعي AVG ممكنه با ارور زير مواجه بشيد&lt;/p&gt;  &lt;p dir="ltr"&gt;Arithmetic overflow error converting expression to data type int. &lt;/p&gt;  &lt;p&gt;اين مشكل معمولا در مواقعي كه تعداد ركورد ها زياد باشن پيش مياد.    &lt;br /&gt;تابع AVG برا اساس نوع ستوني كه روش داره كار ميكنه &lt;a href="http://msdn.microsoft.com/en-us/library/ms177677.aspx"&gt;خروجي&lt;/a&gt; رو تعيين ميكنه.براي مثال اگه ستون شما INT باشه خروجي هم INT ميشه و مثل COUNT_BIG نيست كه خروجيش از نوع&amp;#160; BIGINT باشه.حال اگه مقدار خروجي بشتر از مقدار INT باشه ارور بالا صادر ميشه.     &lt;br /&gt;براي رفع ميايم ورودي رو به BIGINT تبديل ميكنيم و تمام.     &lt;br /&gt;&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: sql"&gt;AVG(cast(innerResult.DiffTime AS BIGINT)) AS [avgTime]&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;مورد بعدي اينه كه تابع AVG از مقادير NULL چشم پوشي ميكنه فقط ممكنه با مشكل خروجي NULL مواجه بشيد توجه كنيد تابع AVG ميتونه مقدار NULL برگردونه بجاي صفر(البته منطقي هم هست). 
  &lt;br /&gt;براي رفع مشكلاتي از اين دست در LINQ خوندن &lt;a href="http://www.dotnettips.info/2010/11/sql-aggregate-functions-linq.html"&gt;+&lt;/a&gt; و &lt;a href="http://www.dotnettips.info/2010/11/sql-aggregate-functions-linq_13.html"&gt;+&lt;/a&gt; پيشنهاد ميشه. 

  &lt;br /&gt;و اما در SQL ميشه از روش زير استفاده كرد 

  &lt;br /&gt;&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: sql"&gt;
SELECT ISNULL(AVG(3+3+3+NULL),0)&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-3535752828514454338?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/DzsSZkjk9XI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/3535752828514454338/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/10/some-tips-on-using-avg-function.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/3535752828514454338?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/3535752828514454338?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/DzsSZkjk9XI/some-tips-on-using-avg-function.html" title="چندين نكته هنگام استفاده از تابع AVG در SQL SERVER" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/10/some-tips-on-using-avg-function.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYERHwzeCp7ImA9WhdaGUs.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-1282157412591677617</id><published>2011-10-04T13:13:00.001+03:30</published><updated>2011-10-30T12:11:45.280+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-30T12:11:45.280+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="OPMLtools" /><title>برنامه ي OPMLtools</title><content type="html">&lt;p align="right"&gt;پیشتر در رابطه با پاک کردن فید های تکراری &lt;a href="http://www.dotnetdev.info/2011/04/removing-duplicate-nodes-from-xml-using.html"&gt;مطلبی&lt;/a&gt; رو نوشته بودم     &lt;br /&gt;تا اینکه چند وقت پیش این &lt;a href="http://www.danatarin.com/questions/18158/%D8%AD%D8%B0%D9%81-%D9%81%DB%8C%D8%AF-%D9%87%D8%A7%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%DA%AF%D9%88%DA%AF%D9%84-%D8%B1%DB%8C%D8%AF%D8%B1?page=1#18196"&gt;سوال&lt;/a&gt; رو تو سایت داناترین دیدم&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="right"&gt;فرض کنید من چندتا bundle رو مشترک میشم که بعضی از فیدهاش رو قبلا مشترک بودم. حالا برای حل مشکل اشتراک های تکراری از یک فید چه راه حلی وجود داره؟ فرض کنید تعداد فیدها خیلی زیاده و امکان بررسی و حذف بصورت دستی وجود نداره. آیا افزوننه ای برای این کار وجود نداره؟ &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="right"&gt;برای حل این مشکل برنامه ی کوچیکی رو تهیه کردم که با گرفتن فایل OPML فید های تکراری رو پاک میکنه و فایل یک دست شده رو براتون ایجاد میکنه.    &lt;br /&gt;&lt;/p&gt; &lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://dotnetdevrepository.svn.codeplex.com/svn/PostImages/OPMLtools.jpg" /&gt;   &lt;p align="right"&gt;   &lt;br /&gt;یکی از ویژگی های این برنامه اینه که ساختار فایل اصلی رو حذف نمیکنه یعنی اگه شما چندین سطح تودرتو داشته باشید این ساختار رو تو فایل خروجی حفظ میکنه(این قسمتش وقتمو زیاد گرفت)     &lt;br /&gt;برای نوشتن این برنامه از &lt;a href="http://www.dotnettips.info/2010/12/subtitle-tools.html"&gt;نرم افزار سورس باز جناب نصیری&lt;/a&gt; خیلی ایده گرفتم از این فرصت استفاده میکنم و از ایشون تشکر میکنم.     &lt;br /&gt;پيشنياز استفاده از &lt;a href="http://opmltools.codeplex.com/"&gt;اين برنامه&lt;/a&gt;، نصب دات نت فريم ورك 4 است. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="http://opmltools.codeplex.com/" href="http://opmltools.codeplex.com/"&gt;http://opmltools.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-1282157412591677617?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/X_I77ib7HVY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/1282157412591677617/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/10/opmltools.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1282157412591677617?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1282157412591677617?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/X_I77ib7HVY/opmltools.html" title="برنامه ي OPMLtools" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/10/opmltools.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMSXo6eSp7ImA9WhdVEkk.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-5949228680104300175</id><published>2011-09-17T11:43:00.001+04:30</published><updated>2011-09-17T11:44:48.411+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-17T11:44:48.411+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Others" /><title>ديتابيس رنگي</title><content type="html">&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://sites.google.com/site/mohammadsahebsite/Colored_Database.gif" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2011/09/09/pointy-haired-bosses-sql.aspx"&gt;منبع&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-5949228680104300175?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/JknaDE9YDWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/5949228680104300175/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/09/colored-database.html#comment-form" title="1 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5949228680104300175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5949228680104300175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/JknaDE9YDWU/colored-database.html" title="ديتابيس رنگي" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/09/colored-database.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04DR3s5eyp7ImA9WhdWFkU.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-7909669040923356343</id><published>2011-09-11T01:54:00.001+04:30</published><updated>2011-09-11T01:56:16.523+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T01:56:16.523+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Task Parallel Library" /><title>هندل کردن خطاها در حلقه های موازی</title><content type="html">&lt;p&gt; در حالت عادی در حلقه های ترتیبی بعد از بوجود اومدن یک خطا (Exception) ادامه حلقه متوقف میشود ولی در حلقه های موازی بعد از بوجود اومدن خطا Thread های در حال اجرا اجازه دارن تا تکمیل کارشون اجرا بشن ولی مابقی تکرار های حلقه دیگه اجرا نمیشن.    &lt;br /&gt;با توجه به اینکه چندین Thread همزمان در حال اجرا هستن احتمال اینکه چندین خطا (Exception) داشته باشیم زیاده از اینرو بجای کلاس Exception با کلاس AggregateException سرو کار داریم که یکی از خواصیت های (Property) اون InnerExceptions هست که شامل کلکسیونی از خطا ایجاد شده طی ه حلقه ماست.     &lt;br /&gt;در مواجه با خطا معمولا 2 حالت پیش میاد     &lt;br /&gt;1-متوقف شدن حلقه در صورت ایجاد خطا     &lt;br /&gt;2-ادامه حلقه در صورت ایجاد خطا     &lt;br /&gt;حالت اول بصورت پیش فرض اعمال میشه (البته همونطور که در ابتدا گفتم این توقف آنی نیست) &lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: csharp"&gt;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;

namespace Parallel_TesTer
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            try
            {
                Parallel.ForEach(Enumerable.Range(1, 100), (int i, ParallelLoopState state, long index) =&amp;gt;
                                                               {
                                                                   Console.WriteLine(&amp;quot;Index {0}, result {1}&amp;quot;, index,
                                                                                     100 / (i / 2));
                                                                   if (state.IsExceptional)
                                                                   {
                                                                       state.Stop();
                                                                   }
                                                               });

            }
            catch (AggregateException aggEx)
            {
                foreach (var innerEx in aggEx.InnerExceptions)
                {
                    Console.WriteLine(innerEx.Message);
                }
            }
            Console.ReadLine();
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;br /&gt;یک وهله از کلاس ParallelLoopState بصورت پیش فرض بوسیله کلاس Parallel برای هر حلقه ایجاد میشه; که از این کلاس میشه برای اگاهی از دیگر تکرار ها ی حلقه و تعامل با اونا استفاده کرد. 

&lt;br /&gt;این کلاس 2 تا متد مهم بنام Stop و Break داره که تو شرایط خاصی میشه از اونا استفاده کرد مثلا اگر در دیگر تکرار ها خطایی رخ داده بود با برسی خاصیت IsExceptional&amp;#160; این کلاس. 

&lt;br /&gt;متد Stop:در مناسبترین حالت سیستم ادامه تکرار ها رو متوقف میکنه 

&lt;br /&gt;متد Break:بعد از فراخوانی این متد تمامی دورهای کوچکتر از دور جاری اجرا میشن براساس ایندکس مثلا اگه در دور 20وم از حلقه بالا این متد صدا زده بشه حتما 1 تا 19 اجرا میشن و خاصیت LowestBreakIteration کلاس ParallelLoopState برابر مقدار 20 میشه و با استفاده از این مقدار میتونیم متوجه بشیم تا کجای دیتا سورس ما پردازش شده. 

&lt;br /&gt;در هر دو متد بالا معمولا نتایج دقیق نیست و این Trade-Off استفاده از حلقه های موازی و داشتن بهره وری بالاس. 

&lt;br /&gt;و اما حالت دوم که من بهش نیاز داشتم ادامه دادن بعد از بروز خطاس 

&lt;br /&gt;با توجه به طبیعت همزمانی از کلکسیون ConcurrentQueue که lock-free و thread-safe هست استفاده میکنیم در آخر هم در صورت وجود خطا لیست خطا ها رو throw میکنیم. 

&lt;div dir="ltr" align="left"&gt;
&lt;pre class="brush: csharp"&gt;

private static void DoParallel()
        {
            var exceptions = new ConcurrentQueue&lt;Exception&gt;();

            Parallel.ForEach(Enumerable.Range(1, 100), (int i) =&gt;
                                                           {
                                                               try
                                                               {
                                                                   Console.WriteLine("Index {0}, Result {1}", i, 100/(i/2));
                                                               }
                                                               catch (Exception ex)
                                                               {
                                                                   exceptions.Enqueue(ex);
                                                               }
                                                           });


            if (!exceptions.IsEmpty) throw new AggregateException(exceptions);
        }

&lt;/pre&gt;
&lt;/div&gt;&lt;/P&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-7909669040923356343?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/NOii4NI74SE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/7909669040923356343/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/09/handling-parallel-loop-exceptions.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7909669040923356343?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7909669040923356343?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/NOii4NI74SE/handling-parallel-loop-exceptions.html" title="هندل کردن خطاها در حلقه های موازی" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/09/handling-parallel-loop-exceptions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECQ3wyeip7ImA9WhdXEEU.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-4392574616488620479</id><published>2011-08-23T13:16:00.001+04:30</published><updated>2011-08-23T13:24:22.292+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T13:24:22.292+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PowerShell" /><title>اسكريپت PowerShell براي بكاپ گرفتن از فايل ها</title><content type="html">&lt;p&gt;&lt;font face="Tahoma"&gt;از بانك هاي SQL بصورت منظم و با رعايت كردن استاندارد خاصي بكاپ گرفته ميشه تو بكاپ سرور براي موارد خاص قرار شد آخرين فول بكاپ در فولدري مجزا نگهداري بشه&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;استاندارد نام گذاري فايل هاي بكاپ بصورت [نام بانك_FULL_تاريخ بكاپ_ساعت بكاپ] است&lt;/font&gt;&lt;/p&gt;  &lt;div dir="ltr" align="left"&gt;   &lt;pre class="brush: ps"&gt;ليست فايل ها
$srcDir=Get-ChildItem D:\SQLServerBackup\ -Recurse 
تاريخ جاري سرور فقط تاريخ
$curDate=get-date -Format D 
فايلهاي كه نام توسعه اونها بك و تاريخ ساختشون امروزه
$srcList=$srcDir | where {$_.Extension -eq &amp;quot;.bak&amp;quot; -and $_.CreationTime.Date -eq $curDate}

اگه ليست خالي نبود
if($srcList.count)
{
 فور ايچ معروف
 foreach ($fileItems in $srcList)
  {
   گر نام فايل شامل كلمه فول بود براي اينكه لاگ بكاپ ها رو رد كنيم كه استاندارد نام گذاريشون متفاوته			
   if($fileItems.BaseName.Contains(&amp;quot;_FULL&amp;quot;))
    {
      توليد آدرس مبدا و مقصد
      $srcNewName=$fileItems.DirectoryName+&amp;quot;\&amp;quot;+$fileItems
      چون قراره آخرين فول بكاپ نگهداري بشه قسمت تاريخ و زمان فايل رو حذف ميكنم تا آخرين فايل اور رايت (دوباره نويسي) بشه
      $desNewName=&amp;quot;D:\LastBackup\&amp;quot; +$fileItems.BaseName.Substring(0,$fileItems.BaseName.IndexOf(&amp;quot;_FULL&amp;quot;))+ &amp;quot;.bak&amp;quot;
      كپي كردن براي اجرا شدن آخرين پارامتر رو برداريد وات ايف
      Copy-Item $srcNewName -Destination $desNewName  -WhatIf
    }
  }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font face="Tahoma"&gt;در آخر هم با استفاده از Schedule ويندوز اسكريپ رو تو زمان هاي مشخص اجر ميكنيم&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Tahoma"&gt;تو قسمت Run دستور زير رو كپي كنيد&lt;/font&gt;&lt;/p&gt;

&lt;div dir="ltr" align="left"&gt;
  &lt;pre class="brush: plain"&gt;
powershell.exe -NoLogo -File &amp;quot;C:\Documents and Settings\Saheb\Desktop\LastBackup.ps1&amp;quot;&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-4392574616488620479?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/aoKudVNmrAk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/4392574616488620479/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/08/powershell-script-to-backup-files.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4392574616488620479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/4392574616488620479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/aoKudVNmrAk/powershell-script-to-backup-files.html" title="اسكريپت PowerShell براي بكاپ گرفتن از فايل ها" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/08/powershell-script-to-backup-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcFRXw9cSp7ImA9WhRaEUk.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-8459617250555823943</id><published>2011-08-11T16:10:00.001+04:30</published><updated>2012-02-13T19:16:54.269+03:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-13T19:16:54.269+03:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>نكاتي براي بهينه سازي Visual Studio 2010 – قسمت سوم</title><content type="html">&lt;p&gt;&lt;font face="Tahoma"&gt;در قسمت &lt;a href="http://www.dotnetdev.info/2011/07/visual-studio-2010-optimization-tips.html" target="_blank"&gt;اول&lt;/a&gt; و &lt;a href="http://www.dotnetdev.info/2011/07/vs-2010-optimization-tips-part2.html" target="_blank"&gt;دوم&lt;/a&gt; بيشتر نكاتي كه عنوان شد مربوط به بهينه سازي خود IDE بود در اين پست(بخش آخر 2 پست قبلي) نكاتي رو كه باعث بالارفتن سرعت Build شدن پروژه ميشه رو برسي ميكنيم&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;1-تعداد پروژه هاي كه بصورت همزمان(موازي) Build بشن رو افزايش بديد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير Tools &amp;gt; Options &amp;gt; Projects and Solutions قسمت Build and Run عدد &lt;strong&gt;maximum number of parallel builds&lt;/strong&gt; رو افزايش بديد(عدد خاصي رو نميشه پيشنهاد داد. بستگي داره.من رو 8 گذاشتم)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_3_1.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;2-ميزان(سطح) verbosity رو كاهش بديد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير Tools &amp;gt; Options &amp;gt; Projects and Solutions قسمت Build and Run مقدار MSBuild project build output verbosity رو روي Quiet بزاريد&lt;/font&gt;&lt;/p&gt; &lt;font face="Tahoma"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_3_2.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;3-اسكن فايلهاي با پسوند OBJ, LIB, ILK, PDB رو از AntiVirus تون خارج كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;4-براي پروژهاتون از يك فولدر يكسان استفاده كنيد براي مثال براي Debug&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;روي نام پروژه راست كليك كنيد و از تب Build قسمت Output Path &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_3_4.png" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;5-مقداري رو كه در مورد بالا براي Output Path ست كرديد ميتونه يك فولدر رو يك درايو مجازي روي رم باشه &lt;a href="http://memory.dataram.com/products-and-services/software/ramdisk"&gt;+&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;6-اگه مورد 4 رو انجام داديد ميتونيد Copy Local = False بذاريد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير References &amp;gt; Properties &amp;gt; Copy Local&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_3_6.png" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;7-براي Build كردن پروژهاتون بصورت دستي از msbuild استفاده كنيد&lt;a href="http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx"&gt;+&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير Tools &amp;gt; External Tools&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_3_7.png" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-8459617250555823943?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/uhmtP-go-ds" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/8459617250555823943/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/08/vs-2010-optimization-tips-part-3.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/8459617250555823943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/8459617250555823943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/uhmtP-go-ds/vs-2010-optimization-tips-part-3.html" title="نكاتي براي بهينه سازي Visual Studio 2010 – قسمت سوم" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/08/vs-2010-optimization-tips-part-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQARH4_eSp7ImA9WhdREUw.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-1797851607439001388</id><published>2011-07-31T17:31:00.001+04:30</published><updated>2011-07-31T17:32:25.041+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T17:32:25.041+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>نكاتي براي بهينه سازي Visual Studio 2010 – قسمت دوم</title><content type="html">&lt;p&gt;&lt;font face="Tahoma"&gt;در ادامه &lt;/font&gt;&lt;a href="http://www.dotnetdev.info/2011/07/visual-studio-2010-optimization-tips.html"&gt;&lt;font face="Tahoma"&gt;پست&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;&amp;#160; قبلي نكات زير هم ميتون كار با Visual Studio رو براي شما راحتر كنن&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;1-پروژه هاي رو كه در حال حاضر كاري روشون انجام نميديد رو Unload كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;با راست كليك كردن رو نام پروژه گزينه Unload رو كيك كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_1.png" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;2-اگه رو فايل هاي پروژه خارج از Visual Studio كار نميكنيد متوجه شدن تغييرات خارج&amp;#160; از Visual Studio روي&amp;#160; فايل ها رو غير فعال كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Documents تيك Detect when file is changed outside the environment رو برداريد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_2.png" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;3-تو فولدر solution تون فايل مخفي با اكستنشن suo وجود داره كه options مربوطه به solution مربوطه داخلش ذخيره ميشه.پاكش كنيد تا سرعت لود شدن رو احساس كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_3.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;4-مانع اسكن شدن فولدرهاي مرتبط با Visual Studio بوسيله Antivirus بشيد (Exclude)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_4.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;5-مورد بالا رو براي پراسس devenv.exe انجام بديد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_5.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;6-از ايندكس شدن فولدرهاي پروژتون جلوگيري كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_6.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;7-در صورتي كه روي پروژه ويندوز فرمي كار ميكنيد قبل از بستن solution فرم هاي باز رو ببنديد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;8-فرم ها رو تو پروژه هاي ويندوز فرمي در حالت Code view باز كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;روي فرم مورد نظر راست كليك كرده “Open With...” رو انتخاب كنيد تو پنجره جديد CSharp Editor رو انتخاب و روي دكمه Set as default كليك كنيد(عكس مربوط به تنظيم در فرم هاي WPF ي است)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;font face="Calibri"&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_8.jpg" /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;9-اگه از كلاينت TortoiseSVN استفاده ميكنيد icon overlays رو غير فعال كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;از مسير TortoiseSVN &amp;gt; Settings &amp;gt; Icon Overlays مقدار Status cache رو None انتخاب كنيد&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_2_9.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;10-آخرين مورد هم كه خيلي تاكيد روش ميشه (مخصوصا براي كساني كه سيستم عاملشون XP هست) ديفرگ كردن هارد ديسكه&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-1797851607439001388?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/vkQ1sllx5e0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/1797851607439001388/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/07/vs-2010-optimization-tips-part2.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1797851607439001388?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/1797851607439001388?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/vkQ1sllx5e0/vs-2010-optimization-tips-part2.html" title="نكاتي براي بهينه سازي Visual Studio 2010 – قسمت دوم" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/07/vs-2010-optimization-tips-part2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEDSHY8eCp7ImA9WhdSEEU.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-5034838123995605509</id><published>2011-07-19T19:40:00.001+04:30</published><updated>2011-07-19T19:47:59.870+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-19T19:47:59.870+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>نكاتي براي بهينه سازي Visual Studio 2010 –  قسمت اول</title><content type="html">&lt;p&gt;يكي از مشكلاتي كه تو نسخه 2010&amp;#160; نرم افزار Visual Studio خيلي محسوسه كندي اونه در ادامه چندين نكته كه ميتونه اين كندي رو كاهش بده ليست شده&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;1-حتما سرويس پك 1 رو نصب كنيد &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=23691"&gt;+&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;2-اگه OS تون 32 بيتيه و بيش از 2 گيگ رم داريد &lt;a href="http://www.dotnetdev.info/2009/08/2-visual-studio.html"&gt;اين&lt;/a&gt; پست رو ببينيد&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;3-splash screen آغازين Visual Studio رو غير فعال كنيد (تستي كه خودم انجام دادم حدودا 7 ثانيه فرقش شد!!!)&lt;/p&gt;  &lt;p&gt;&amp;quot;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe&amp;quot; /nosplash&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;4-صفحه آغازين Visual Studio&amp;#160; رو خالي قرار بديد&lt;/p&gt;  &lt;p&gt;از مسير Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Startup مقدارShow empty environment&amp;#160; رو ست كنيد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_4.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;5-اگه از سورس كنترلرTeam Foundation استفاده نميكنيد (توجه كنيد SVN تو اين بخش ليست نميشه پس نگران نباشيد)&lt;/p&gt;  &lt;p&gt;از مسير&amp;#160; Tools &amp;gt; Options &amp;gt; Source Control مقدار None رو ست كنيد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_5.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;6-تو نسخه جديد&amp;#160; Visual Studio كه با WPF طراحي شده به صورت پيش فرض براي نمايش صفحات از hardware rendering استفاده ميشه&amp;#160; و اگه VGA شما مشكل داشته باشه يا آپديت نباشه باعث كندي ميشه و&lt;a href="http://blogs.msdn.com/b/ddperf/archive/2010/09/16/vs2010-performance-and-bad-video-drivers-hardware-redux.aspx"&gt;…&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;البته با روش زير به كل rich client visual experience (ترجمش يكم گيج كنندس ولي منظور همون زيباي محيط IDE هست) رو غير فعال ميكنيم و از software rendering استفاده ميكنيم&amp;#160; بنظرم سرعت بالا بهتر از زيباييه&lt;/p&gt;  &lt;p&gt;از مسير Tools &amp;gt; Options &amp;gt; Environment&amp;#160; تيك&amp;#160; Automatically adjust visual experience based on client performance&amp;#160; و سپس Enable rich client visual experience&amp;#160; و Use hardware graphics acceleration if available&amp;#160; رو بردارديد &lt;/p&gt;  &lt;p&gt;اگه زيبايي براتون مهمه Enable rich client visual experience رو تيك بزنيد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_6.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;7-فايلي كه داخلش داريم كار ميكنيم به صورت پيش فرض تو Solution Explorer انتخاب شدس و در واقع Visual Studio داره كلاس و… شما رو Track ميكنه &lt;/p&gt;  &lt;p&gt;از مسير Tools &amp;gt; Options &amp;gt; Projects and Solutions&amp;#160; گزينه Track Active Item in Solution Explorer رو غير فعال كنيد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_7.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;8-IntelliTrace&amp;#160; يكي از ويژگي هاي جديد ديباگينگ tudio تو نسخه 2010 هست ولي سربار خودش رو داره مخصوصا هنگام كار با MVC&lt;/p&gt;  &lt;p&gt;از آدرسي Tools &amp;gt; Options &amp;gt; Intellitrace تيك Enable IntellliTrace رو&amp;#160; برداريد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_8.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;9-اگه شما هم از ReSharper استفاده ميكنيد نيازي نداريد كه Visual Studio&amp;#160; ليست اعضاي كلاسي كه داخلش هستيد رو بهتون نشون بده (بصورت يك نوار كه علاوه بر پرفرمنس فضاي بيهوده اي رو ميگيره) با فشردن Alt+\&amp;#160; اين كار براي شما انجام ميشه&lt;/p&gt;  &lt;p&gt;از مسير Tools &amp;gt; Options &amp;gt; Text Editor &amp;gt; C# تيك Navigation bar رو برداريد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_9.gif" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;10-اگه تو پروژتون از كنترل هاي اختصاصي استفاده&amp;#160; نميكنيد&lt;/p&gt;  &lt;p&gt;از مسير Tools -&amp;gt; Options -&amp;gt; Windows Forms Designer گزينه AutoToolboxPopulate&amp;#160; رو False&amp;#160; كنيد&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_10.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;11-زندگي بدون&amp;#160; قابليت &lt;a href="http://www.aliaghdam.ir/2011/07/track-changes-visual-studio.html"&gt;Track Changes&lt;/a&gt; هم آسونه پس …&lt;/p&gt;  &lt;p&gt;از مسير Tools -&amp;gt; Options -&amp;gt; Text Editor&amp;#160; تيك گزينه Track Changes رو بر داريد&lt;/p&gt;                &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/vs_op_11.jpg" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-5034838123995605509?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/cBCAMsLdzVg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/5034838123995605509/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/07/visual-studio-2010-optimization-tips.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5034838123995605509?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/5034838123995605509?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/cBCAMsLdzVg/visual-studio-2010-optimization-tips.html" title="نكاتي براي بهينه سازي Visual Studio 2010 –  قسمت اول" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/07/visual-studio-2010-optimization-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QCQHY4cCp7ImA9WhZaE0g.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-7708396186136967289</id><published>2011-06-29T18:17:00.001+04:30</published><updated>2011-06-29T18:19:21.838+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-29T18:19:21.838+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>تست کردن وب سرویس ها با WCFStorm</title><content type="html">&lt;p&gt;&lt;strong&gt;سناریو / مشکل&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;بعد از نوشتن وب سرویس و هاست کردن اون تو نت برای تست(فراخوانی) کردن ش باید یه پروژه تستی ایجاد و&amp;#160; وب سرویس هام رو تست کنم که کاری زمانبره&lt;/p&gt;  &lt;p&gt;&lt;b&gt;راه حل:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;استفاده از &lt;b&gt;&lt;a href="http://www.wcfstorm.com/wcf/home.aspx"&gt;WCFStorm&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;نسخه مجانی و open source اونو میتونید از &lt;a href="http://storm.codeplex.com/"&gt;اینجا&lt;/a&gt; دریافت کنید&lt;/p&gt;  &lt;p&gt;برای اضافه کردن سرویس File --&amp;gt; Service –&amp;gt; Add و آدرس وب سرویس رو وارد کنید&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/AddServiceEndpoint1.Png" /&gt;&lt;/p&gt;  &lt;p&gt;wcfstorm با خوندن متا دیتای وب سرویس متدهای اونو برای شما لیست میکنه&lt;/p&gt;  &lt;p&gt;میتونید از &lt;a href="http://www.deeptraining.com/webservices/weather.asmx"&gt;این&lt;/a&gt; وب سرویس برای تست استفاده کنید&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;توجه&lt;/strong&gt;:با روشی که &lt;a href="http://www.dotnettips.info/2011/04/add-service-reference-vsnet.html"&gt;اینجا&lt;/a&gt; برای از كار انداختن صفحه‌ي Add service reference در VS.NET&amp;#160; معرفی شده به احتمال زیاد wcfstorm نمیتونه کار کنه&lt;/p&gt;  &lt;p&gt;بعد از انتخاب متد مورد نظر لیست پارامترهای اون تو پنجره RequestPane لیست میشه&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/MethodSelected.Png" /&gt;&lt;/p&gt;  &lt;p&gt;یکی از نکات جالب wcfstorm پشتیبانی از نوع هایه پیچیدس ساختار CompositeType رو میتنونید تو شکل زیر ببینید&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/CompositeTypeClass.Png" /&gt;&lt;/p&gt;  &lt;p&gt;برای مقدار دادن به پارامتر ها با کلیک کردن روی پارامتر مورد نظر تو پنجره ای که باز میشه قسمت Value مقدار مورد نظر رو وارد کنید&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/EditObject1.Png" /&gt;&lt;/p&gt;  &lt;p&gt;بعد از زدن دکمه Send خروجی به این شکل میشه(متد تستی GetDataUsingContract ورودی رو بعنوان خروجی بر میگردونه)&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/InvokeMethodWithResult%5B1%5D.Png" /&gt;&lt;/p&gt;  &lt;p&gt;و اما نکته قابل توجه اگه شما تو کانفیگ وب سرویس چندین endpoint تعریف کرده باشید wcfstorm&amp;#160; اولی رو استفاده میکنه&lt;/p&gt;  &lt;p&gt;نرم افزار های &lt;a href="http://webservicestudio.codeplex.com/"&gt;+&lt;/a&gt; و &lt;a href="http://wsstudioexpress.codeplex.com/"&gt;+&lt;/a&gt; و &lt;a href="http://code.google.com/p/webservicestudio2/"&gt;+&lt;/a&gt; و &lt;a href="http://www.soapui.org/"&gt;+&lt;/a&gt; برای تست وب سرویس ها استفاده میشن&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wcfstorm.com/wcf/getting-started.aspx"&gt;منبع&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-7708396186136967289?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/QOnVwgKFceA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/7708396186136967289/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/06/test-web-services-with-wcfstorm.html#comment-form" title="4 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7708396186136967289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/7708396186136967289?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/QOnVwgKFceA/test-web-services-with-wcfstorm.html" title="تست کردن وب سرویس ها با WCFStorm" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/06/test-web-services-with-wcfstorm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNR3syfCp7ImA9WhZbGEg.&quot;"><id>tag:blogger.com,1999:blog-8823258409188137452.post-590955844796920647</id><published>2011-06-23T19:01:00.001+04:30</published><updated>2011-06-23T21:58:16.594+04:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-23T21:58:16.594+04:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sql Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Resource Governor" /><title>مقدمه ای بر Resource Governor در SQL Server 2008</title><content type="html">&lt;p&gt;&lt;strong&gt;سناریو / مشکل&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;روي يك سرور هم نرم افزار ERP داريم و هم نرم افزار گزارش گيري چون نرم افزار گزارش گيري منابع بيشتري مصرف ميكنه نرم افزار ERP كه تو سازمان از اولويت بالايي برخوردارده كند ميشه &lt;/p&gt;  &lt;p&gt;&lt;b&gt;راه حل:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="OLE_LINK5"&gt;&lt;/a&gt;&lt;a name="OLE_LINK4"&gt;&lt;/a&gt;&lt;a name="OLE_LINK8"&gt;&lt;/a&gt;Resource Governor يك تكنولوژي جديد در SQL Server 2008 هست كه از طريق تعيين كردن محدوديت مصرف (استفاده) منابع ;بوسيله درخواست هاي ورودي به سرور بارهاي كاري(workloads) و منابع SQL Server رو مديريت میکنه.&lt;/p&gt;  &lt;p&gt;در سروري كه ما 2 (يا چند) بار کاری متمايز داريم براي مثال بار كاري نرم افزار ERP و بار كاري نرم افزار گزارش گيري Resource Governor بين اين 2 فرق قائل ميشه و مياد منابع مشترك درخواست شده(CPU و memory) رو براساس محدوديت هاي كه ما به ازاي هر باركاري مشخص كرديم به اون درخواست تخصيص ميده.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://sites.google.com/site/mohammadsahebsite/ResourceGovernor.png" /&gt;&lt;/p&gt;  &lt;p&gt;در واقع ما ميايم براي يك باركاري مشخص اولويت در نظر ميگيرم در اينجا نرم افزار ERP و تضمين ميكنيم در شرايطي كه بين چند بار كاري متمايز بر سر يك Resource خاص رقابت بوجود اومد باركاري با اولويت بالا حتما پيروز بشه و درنتيجه كامل بشه.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;براي مثال در شكل بالا 2 گروه كاري داريم و بسته به نياز و اهميت حداكثر و حداقل مصرف منابع مشترك (CPU و memory) رو براي هر گروه تعيين مكنيم&lt;/p&gt;  &lt;p dir="ltr"&gt;ERP Workloads Max CPU =90% Min CPU=50%&lt;/p&gt;  &lt;p dir="ltr"&gt;Reporting Workloads Max CPU =20% Min CPU=10%&lt;/p&gt;  &lt;p&gt;درخواست هاي وارد شده به سرور بوسيله تابع كلاس بندي و براساس شرايطي كه ما تعيين ميكنيم به سمت گروه كاري مورد نظر هدايت ميشه&lt;/p&gt;  &lt;p&gt;براي مثال داخل تابع ميگيم اگه يوزر درخواست كننده ERP_User بود اين درخواست به سمت گروه كاري ERP دايركت بشه و...&lt;/p&gt;  &lt;p&gt;منابع: &lt;a href="http://www.mssqltips.com/tip.asp?tip=1720"&gt;+&lt;/a&gt; و&lt;a href="http://msdn.microsoft.com/en-us/library/bb933866.aspx"&gt; +&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8823258409188137452-590955844796920647?l=www.dotnetdev.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mohammadsaheb/~4/Kist5_eFQ2k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.dotnetdev.info/feeds/590955844796920647/comments/default" title="نظرات پيام" /><link rel="replies" type="text/html" href="http://www.dotnetdev.info/2011/06/introduction-to-resource-governor.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/590955844796920647?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8823258409188137452/posts/default/590955844796920647?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mohammadsaheb/~3/Kist5_eFQ2k/introduction-to-resource-governor.html" title="مقدمه ای بر Resource Governor در SQL Server 2008" /><author><name>محمد صاحب</name><uri>http://www.blogger.com/profile/09280299737555489895</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.dotnetdev.info/2011/06/introduction-to-resource-governor.html</feedburner:origLink></entry></feed>

