<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Adiel Sharabi</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/</link><description>Life, the Universe, and Everything
(.Net for instance)</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>VS 2012 schema compare broke SQL server views designer</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/09/09/vs-2012-schema-compare-broke-sql-server-views-designer.aspx</link><pubDate>Sun, 09 Sep 2012 16:53:50 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1273306</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1273306</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/09/09/vs-2012-schema-compare-broke-sql-server-views-designer.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p&gt;תקלה קטנה שנתקלנו בה - &lt;/p&gt;    &lt;p&gt;המערכת – VS 2012 עם פרוייקט DATA. בבסיס הנתונים ישנם מספר Views. בסיס הנתונים יושב על שרת 2008 R2 עם Management studio 2008. &lt;/p&gt;    &lt;p&gt;כאשר משנים את הVIEW ומעבירים את השינוי דרך השוואת סכמות הוא מפסיק לעלות בDesigner של Management Studio. &lt;/p&gt;    &lt;p&gt;לאחר פשפוש קל נמצא האשם – Extended properties.&lt;/p&gt;    &lt;p&gt;כאשר גוררים בDesigner את הטבלאות נוצרים מאפיינים ששומרים את המיקום הזה לפעמים הבאות, ההשערה שלי היא שכאשר מבצעים השוואת סכמות בVS 2012 זה עובר שינוי ומותאם לSQL 2012 למרות שבסיס הנתונים הוא ב2008. לכן כאשר מתבצע Deploy הDesiger של 2008 לא יודע לזהות נכון את המאפיינים ולא מוכן לעלות, במחיקה שלהם הבעיה נפתרת. &lt;/p&gt;    &lt;p&gt;מקווה שזה יעזור למישהו… &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_707C627B.png" /&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1273306" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Debug/default.aspx">Debug</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/VS2012/default.aspx">VS2012</category></item><item><title>Git-Tfs Step by Step</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/08/06/git-tfs-step-by-step.aspx</link><pubDate>Mon, 06 Aug 2012 21:57:03 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1194839</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1194839</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/08/06/git-tfs-step-by-step.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p&gt;גיט (Git בלע”ז) מאד מוצא חן בעיניי, הוא (היא?) גמיש, זריז, מתאים מאד לשיטת העבודה שלי שחלקה היא מול צוותים מבוזרים.      &lt;br /&gt;אז התחלתי להשתמש בכל מיני פרוייקטים קטנים, אחלה. קראתי &lt;a href="http://git-scm.com/book"&gt;מדריך מעולה&lt;/a&gt; – מומלץ בחום. &lt;/p&gt;    &lt;p&gt;רק נקודה אחת נשאר לסגור, רוב הפרוייקטים יושבים על TFS…&lt;/p&gt;    &lt;p&gt;אז הנה הפתרון צעד אחר צעד. &lt;/p&gt;    &lt;p&gt;שלב מקדים – התקנת git. מחוץ למדריך זה, מומלץ להתקין &lt;a href="http://code.google.com/p/gitextensions/"&gt;GitExtensions&lt;/a&gt;. &lt;/p&gt;    &lt;p&gt;1) התקנת git-tfs &lt;/p&gt;    &lt;p&gt;הדרך הארוכה – &lt;a href="https://github.com/git-tfs/git-tfs/"&gt;להוריד את הקוד,&lt;/a&gt; לקמפל ולעבוד עם זה. &lt;/p&gt;    &lt;p&gt;הדרך הקצרה –&lt;a href="http://chocolatey.org/"&gt;חתיכת שוקולד&lt;/a&gt; (ברצינות… &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-justkidding" alt="Just kidding" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-justkidding_17CA8D32.png" /&gt;) ומיד אח”כ - cinst GitTfs. (מוזר לא? יותר מידיי פשוט &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_1CD1EC43.png" /&gt;) &lt;/p&gt;    &lt;p&gt;2) יצירת מחסן&lt;/p&gt;    &lt;p&gt;מכינים את התיקייה בה ישב הפרוייקט, מנווטים לשם עם Git Bush (מותקן במחיצה של Git) &lt;/p&gt;    &lt;p&gt;ומקלידים git tfs init http://tfs:8080/tfs/DefaultCollection $/some_project&lt;/p&gt;    &lt;p&gt;(לעדכן כמובן לפרטים המתאימים – אם צריך להכניס שם משתמש וסיסמא) &lt;/p&gt;    &lt;p&gt;3) לקחת את הקוד (יכול לקחת זמן – כפוף לגודל פרוייקט, גילו ותעבורה ברשת) &lt;/p&gt;    &lt;p&gt;git tfs pull&lt;/p&gt;    &lt;p&gt;תוך כמה שניות תתחילו לראות את הגרסאות יורדות. &lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;ישנה אפשרות לעשות את 2 ו3 ביחד עם הפקודה&lt;/p&gt;    &lt;p&gt;git tfs clone http://tfs:8080/tfs/defaultCollection $/some_project&lt;/p&gt;    &lt;p&gt;העניין הוא שכשניסיתי את זה בפרוייקט בינוני זה נקטע באמצע ואז צריך להתחיל מחדש. השיטה עם הpull מאפשרת להמשיך גם אחרי קטיעות. (והיו לי לא מעט כאלו) &lt;/p&gt;    &lt;p&gt;אפשרות שלישית זה quick-clone שמוריד רק את הגרסה האחרונה. &lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;עד כאן הקמה. מקווה להספיק לכתוב בקרוב על דרך השימוש. &lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1194839" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tools/default.aspx">Tools</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Git/default.aspx">Git</category></item><item><title>Why you need the source code for 3rd party components.</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/25/why-you-need-the-source-code-for-3rd-party-components.aspx</link><pubDate>Wed, 25 Jul 2012 07:13:46 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1170088</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1170088</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/25/why-you-need-the-source-code-for-3rd-party-components.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/18/deobfuscator-or-not.aspx"&gt;באחד הפוסטים הקודמים&lt;/a&gt;&amp;#160; נתקלתי בבעיה עם רכיבים צד ג’ שעבדו באופן לא מובן מספיק ונאלצתי לפצח אותם ממש כדי להשתמש בהם כמו שצריך (מחסור בתיעוד ועוד) &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;הפעם נתקלתי ברכיב שמניח הנחה מאד בעייתית. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&lt;a href="http://telerik.com"&gt;טלריק&lt;/a&gt; – חברה רצינית ביותר לרכיבים לדוט נט (ועוד ועוד ועוד…) מפתחת רכיבים לHTML 5 עם תמיכה ב MVC בשם &lt;a&gt;KendoUI&lt;/a&gt;. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;שמתי גריד, חיברתי מקור AJAX הכל נראה מצויין בדיוק כמו בדוגמאות. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;תוך כדי דפדפוף (Paging) אני שם לב שאני לא מצליח לעבור בין הדפים, לא שאין קריאות, יש קריאות והשרת מחזיר את אותו דף כל הזמן. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;בקפיצה מאד גדולה קדימה ישנם שינויים אבל בעיקרון אותו דף חוזר כל הזמן. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;אז התחלתי לנבור. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;דבר ראשון -&amp;#160; כדי לבצע דפדפוף עם EF חייבים מיון. אז ביצעתי מיון קשיח (מוגדר בקוד) – לא עבד. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;דבר שני – בדקתי דפים אחרים – כן עובד. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;דבר שלישי – פתחתי את הקוד של הדוגמאות – לא מצאתי הבדלים. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;ואז התחלתי לחפור בקוד המקור (מזל שטלריק מספקים אותו… &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_5E0F9218.png" /&gt; ) &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;נקודת הממשק שלי הייתה מתודה ToDataSourceResult שמקבלת את הבקשה ומבצעת את הפעולות של הגריד&amp;#160; (מיון, סינון, דפדוף). &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;כמה קפיצות פנימה הובילו לקוד הבא - &lt;/div&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!sort.Any() &amp;amp;&amp;amp; queryable.Provider.IsEntityFrameworkProvider())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;      {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;          &lt;span style="color:#008000;"&gt;// The Entity Framework provider demands OrderBy before calling Skip.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;          SortDescriptor sortDescriptor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SortDescriptor&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;          {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;              Member = queryable.ElementType.FirstSortableProperty()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;          };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;          sort.Add(sortDescriptor);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;          temporarySortDescriptors.Add(sortDescriptor);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;      }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;נחמד לא? כדי שלא נחטוף חריג עשו לנו טובה ובחרו עבורנו בצורה שרירותית את השדה לפיו יתבצע המיון (כמובן רק אם לא היה מיון מוגדר מראש מהגריד) &lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;אגב זה הקוד שמחזיר את השם של השדה המבוקש -&lt;/div&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; FirstSortableProperty(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; Type type)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;       {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;           PropertyInfo firstSortableProperty = type.GetProperties().Where(property =&amp;gt; property.PropertyType.IsPredefinedType()).FirstOrDefault();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (firstSortableProperty == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;           {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotSupportedException(Exceptions.CannotFindPropertyToSortBy);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;           }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; firstSortableProperty.Name;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;       }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div dir="rtl"&gt;אז מה רע? &lt;/div&gt;

&lt;div dir="rtl"&gt;שבמקרה הזה השדה הנבחר היה שם רחוב…&lt;/div&gt;

&lt;div dir="rtl"&gt;המשמעות הייתה שאילתה שנראית ככה (ותודה לIntelliTrace שחסך מלא זמן): &lt;/div&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; The command text &amp;quot;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; 10 &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; [Var_4].[&lt;span style="color:#0000ff;"&gt;Index&lt;/span&gt;@] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_Index@], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; [Var_4].[רחוב] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_רחוב], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; [Var_4].[EMAIL] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_EMAIL], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; [Var_4].[שם מלא] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_שם מלא] &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; [dbo].[PT] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Var_4]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;NOT&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; [Var_6].[Internal_רחוב1] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_רחוב1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; ( &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; 30 &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;         [Extent1].[רחוב] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Internal_רחוב1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; [dbo].[MainData] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; [Extent1].[רחוב] &lt;span style="color:#0000ff;"&gt;ASC&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     )  &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Var_6]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt; ([Var_4].[רחוב] = [Var_6].[Internal_רחוב1]) &lt;span style="color:#0000ff;"&gt;OR&lt;/span&gt; (([Var_4].[רחוב] &lt;span style="color:#0000ff;"&gt;IS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NULL&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;AND&lt;/span&gt; ([Var_6].[Internal_רחוב1] &lt;span style="color:#0000ff;"&gt;IS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NULL&lt;/span&gt;))))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; [Var_4].[רחוב] &lt;span style="color:#0000ff;"&gt;ASC&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;או בעברית (אנסה לתרגם):&lt;/p&gt;

&lt;p&gt;תן לי את ה10 הראשונים (מתוך כלל הנתונים) שהרחוב שלהם לא שווה לאף אחד בתוך ה30 הראשונים. &lt;/p&gt;

&lt;p&gt;מכיוון שלהרבה מאד אנשים אין כתובת בבסיס הנתונים אותם עשרה חוזרים שוב ושוב… &lt;/p&gt;

&lt;p&gt;הפתרון היה פשוט, להוסיף לכל מיון עוד שדה שמאפשר מיון (אינדקס למשל)&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ActionResult GetPeoples([DataSourceRequest] DataSourceRequest request)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;         var filterd = ApplyFilters();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;         request.Sorts.&lt;span style="color:#0000ff;"&gt;Add&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SortDescriptor() { Member = &amp;quot;&lt;span style="color:#0000ff;"&gt;Index&lt;/span&gt;&amp;quot; });&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;         var res= Json( filterd.ToDataSourceResult(request));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; res;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;זה למה כדאי שהקוד מקור של כל הרכיבים צד ג’ יהיו קרוב קרוב. &lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1170088" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Debug/default.aspx">Debug</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Html+5/default.aspx">Html 5</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Telerik/default.aspx">Telerik</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Kendo/default.aspx">Kendo</category></item><item><title>הכנסת תאריך/זמן לפי שעון מקומי משרת מרוחק</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/20/1162799.aspx</link><pubDate>Fri, 20 Jul 2012 04:06:17 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1162799</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1162799</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/20/1162799.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p align="right"&gt;כדי להכניס זמן מקומי (נגיד של ישראל) לשדה תאריך/זמן במידה והשרת ממוקם בחו”ל ואין גישה לשעון שלו או שהמיקום הסופי לא מוחלט (אז’ור למשל) ניתן להחליט לפי איזה שעון יכתב הזמן. &lt;/p&gt;    &lt;p align="right"&gt;לשם כך ניתן להשתמש ב &lt;a href="http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx"&gt;TimeZoneInfo&lt;/a&gt;&amp;#160; המאפשר בדיקה והשוואה מול שעון אחר. &lt;/p&gt;    &lt;p align="right"&gt;הביטוי הבא מייצג את הזמן המקומי בישראל (כולל שעון/קיץ חורף) &lt;/p&gt;    &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;     &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;       &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; DateTime.UtcNow + &lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; TimeZoneInfo.FindSystemTimeZoneById(&lt;span style="color:#006080;"&gt;&amp;quot;Israel Standard Time&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


      &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     .GetUtcOffset(DateTime.UtcNow)&lt;/pre&gt;
&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;את המחרוזת של ישראל ניתן למצוא (כמו את שאר המחרוזות) &lt;a href="http://stackoverflow.com/questions/7908343/list-of-timezone-ids-for-use-with-findtimezonebyid-in-c"&gt;כאן&lt;/a&gt;&lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;

&lt;div dir="rtl" align="right"&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1162799" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Azure/default.aspx">Azure</category></item><item><title>Simple Sequence diagram</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/09/simple-sequence-diagram.aspx</link><pubDate>Mon, 09 Jul 2012 22:27:43 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1150329</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1150329</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/07/09/simple-sequence-diagram.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p align="right"&gt;לעיתים די קרובות אני רוצה להמחיש בצורה פשוטה את המסלול של הקוד.      &lt;br /&gt;אז יש לוח לבן, נחמד אבל נדיף &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_664A9787.png" /&gt; (וגם צריך להגיע למשרד בשביל זה &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-sadsmile_3CD65647.png" /&gt; )       &lt;br /&gt;יש ויזיו – ואז צריך תואר ראשון או לפחות סמסטר כדי לצייר משהו, לגרור חצים לראות שהם במקום בצבע והצורה וכו’       &lt;br /&gt;יש אפילו לויז’ואל סטודיו אבל – הקוד צריך להיות מוכן, אין שום שליטה על התוצאה וזה לוקח מלללללללא זמן.&lt;/p&gt;    &lt;p align="right"&gt;ויש - &lt;a href="http://www.websequencediagrams.com/"&gt;http://www.websequencediagrams.com/&lt;/a&gt;&lt;/p&gt;    &lt;p align="right"&gt;מהיר, פשוט, נחמד, קליל ומספיק עשיר כדי להציג דברים פשוטים ונחמדים.&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;       &lt;div align="right"&gt;אפשר להטמיע בכל אתר (או דף HTML). &lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="right"&gt;הגרסה החינמית מספיק טובה לרוב הדברים. &lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="right"&gt;ניתן לעצב בקלילות.&lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt;    &lt;p align="right"&gt;אהבתי.&lt;/p&gt;    &lt;p align="right"&gt;באיזה כלים אתם משתמשים לדיאגרמות?     &lt;br /&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1150329" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tools/default.aspx">Tools</category></item><item><title>האם זה הסוף של סילברלייט</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/21/1126479.aspx</link><pubDate>Thu, 21 Jun 2012 22:22:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1126479</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1126479</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/21/1126479.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt; &lt;p&gt;בעקבות &lt;a href="http://www.engadget.com/2012/06/20/microsoft-introduces-windows-phone-8/"&gt;ההכרזה&lt;/a&gt; של מיקרוסופט על Windows phone 8 לפיה הליבה תהיה משותפת עם חלונות 8 (הבעל”ט) אני תוהה (טרם מצאתי התייחסות רשמית) האם זה הסוף של סילברלייט. &lt;/p&gt;  &lt;p&gt;בחודשים האחרונים ממילא היו שמועות עקשניות שסילברלייט 5 הוא האחרון ברשימה. כאשר חלונות 8 הוכרזה עם תמיכה מובנית בHTML 5 כבר חשתי שזה שאלה של זמן. &lt;/p&gt;  &lt;p&gt;במידה ו WP8 יתמוך כמו חלונות 8 בWinRT זה אומר שניתן לעשות הכל ללא סילברלייט. זה יהיה בהחלט המסמר האחרון בארון.&lt;/p&gt;  &lt;p&gt;יתרה מכך זה ייתן יתרון אדיר למיקרוסופט, מערכת הפעלה שמריצה על הליבה את HTML 5 פותחת למעשה למפתחים עולם שלם פיתוח אחיד. (מוזילה עובדת על &lt;a href="https://wiki.mozilla.org/B2G"&gt;משהו כזה&lt;/a&gt;) &lt;/p&gt;  &lt;p&gt;אגב מבחינתי הסנונית הראשונה שסימנה את הנטישה של סילברלייט היתה המעבר של Skydrive מעריכת מסמכים בסילברלייט לHTML. &lt;/p&gt;  &lt;p&gt;אגב לדעתי זו תהיה המגמה של כל הניידים (למורת הרוח של היצרניות) לעבור לHTML 5 עם שילוב כזה או אחר במערכת ההפעלה כדי לקבל יכולות נוספות. &lt;/p&gt;  &lt;p&gt;מה דעתכם? &lt;/p&gt;
נ.ב. הפורטל החדש של אז&amp;#39;ור הפך גם הוא לHTML. 


 &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1126479" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Html+5/default.aspx">Html 5</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/_DE05D705E905D105D505EA05_/default.aspx">מחשבות</category></item><item><title>Deobfuscator or not?</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/18/deobfuscator-or-not.aspx</link><pubDate>Mon, 18 Jun 2012 16:15:15 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1123253</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1123253</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/18/deobfuscator-or-not.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p&gt;(בכוונה אני מעלים את הפרטים כדי לא לפגוע במי מהמעורבים בעניין) &lt;/p&gt;    &lt;p&gt;בפרוייקט מסויים שאני מייעץ לו הוחלט לרכוש רכיבים צד ג כדי לנהל את נושא הרשיונות.&lt;/p&gt;    &lt;p&gt;לאחר חיפוש ומחקר מסויים נבחרה חברה אשר המוצר שלה היה הקרוב ביותר לדרישות (יכולות + מחיר) &lt;/p&gt;    &lt;p&gt;כאשר התחלנו לעבוד בפועל הסתבר שתסריט מסויים אשר היה נראה שהוא אפשרי ופשוט – הוא לא כ”כ פשוט ובמקום שהוא יהיה אוטמטי הוא ידני לחלוטין. &lt;/p&gt;    &lt;p&gt;התיעוד על הרכיבים לא נתן פיתרון פשוט לבעיה, היא נכתבה והועברה למחלקת התמיכה. &lt;/p&gt;    &lt;p&gt;למותר לציין שכחברה רצינית שעוסקת באבטחת מוצרים כל הרכיבים עברו Obfuscator.&amp;#160; ואין כ”כ יכולת להבין איך הם עובדים כדי לנסות לעקוף את המגבלות. &lt;/p&gt;    &lt;p&gt;חיפוש קל העלה את &lt;a href="https://github.com/0xd4d/de4dot"&gt;de4dot&lt;/a&gt; שמאפשר “טיפול” בבעיה, לאחר קצת נבירה וחפירה נמצא המתודה שדריסה שלה (8 שורות סה”כ) אפשרו פיתרון (לא הכי נקי אבל יעיל ועובד) של הבעיה. &lt;/p&gt;    &lt;p&gt;“בעיה” נוספת הייתה הגנה שמצריכה אסמבלי חתום וכו’, שוב, “טיפול” (ilasm-ildasm) פתר את הבעיה לצורכי פיתוח.&lt;/p&gt;    &lt;p&gt;תזכורת: הקוד הסופי רץ ללא בעיות על הרכיבים המקוריים, המוצר ברישיון חוקי והכל תקין. &lt;/p&gt;    &lt;p&gt;אשמח לשמוע, מה אומרים האם זה נכון/ראוי?&amp;#160; &lt;/p&gt;    &lt;p&gt;האם קוד המקור צריך להיות מצורף לכל רכיב? &lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1123253" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tools/default.aspx">Tools</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Security/default.aspx">Security</category></item><item><title>NDepend 4</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/04/ndepend-4.aspx</link><pubDate>Mon, 04 Jun 2012 21:41:22 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1111755</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1111755</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/06/04/ndepend-4.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.ndepend.com"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/image_7355332C.png" width="231" height="58" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;שבוע שעבר השתחררה גרסה 4 של &lt;a href="http://www.ndepend.com" target="_blank"&gt;NDepend&lt;/a&gt;.       &lt;br /&gt;למי שלא מכיר הכלי מאפשר תחקור של הקוד בכל מיני רמות, יצירת שאילתות על הקוד (החל משאילתות בסיסיות כגון – כמה מחלקות ישנן עם יותר מX שורות קוד) &lt;/p&gt;    &lt;p&gt;הנקודה המשמעותית בשחרור הזה (לטעמי) הוא CQLing. &lt;/p&gt;    &lt;p&gt;למעשה זהו מנגנון שאילתות שנראה בדיוק כמו Linq. הרבה יותר פשוט ואינטואיטיבי. &lt;/p&gt;    &lt;p&gt;היכולות של הכלי מדהימות ובפרוייקטים גדולים הוא נותן עבודה מאד מהירה. &lt;/p&gt;    &lt;p&gt;מקצת היכולות: &lt;/p&gt;    &lt;p&gt;1. גרף תלויות (פי 100 יותר מהיר ממה שמובנה בVS)      &lt;br /&gt;2. יצירת “חוקים” לשימוש חוזר (למעשה הוא מגיע עם סט די עשיר)       &lt;br /&gt;3. יכולת אכיפה של חוקים, בזמן בנייה.       &lt;br /&gt;4. תאום “קוד מכוסה” עם כמה כלים.       &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;ועוד ועוד. &lt;/p&gt;    &lt;p&gt;בקיצור מומלץ בחום&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.ndepend.com/Screenshots.aspx"&gt;צילומי מסך&lt;/a&gt; – מומלץ לעבור&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1111755" width="1" height="1"&gt;</description></item><item><title>NCrunch!!!</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/05/22/ncrunch.aspx</link><pubDate>Wed, 23 May 2012 03:00:18 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1099846</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1099846</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/05/22/ncrunch.aspx#comments</comments><description>&lt;p dir="rtl" align="right"&gt;למי שלא מכיר,    &lt;br /&gt;למי שנוהג לכתוב טסטים, (מי שלא – שלא יגלה…&lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_5ACDBFD0.png" /&gt;) &lt;/p&gt;  &lt;p dir="rtl" align="right"&gt;כלי מדהים (קצת חבלי התקנה וקינפוג) תענוג לעבוד איתו. &lt;/p&gt;  &lt;p dir="rtl" align="right"&gt;&lt;a href="http://www.ncrunch.net/" target="_blank"&gt;&lt;img src="http://www.ncrunch.net/RM/ncrunchTitle.png" width="392" height="108" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p dir="rtl" align="right"&gt;הכלי מאפשר ריצה ברקע של הטסטים, מעדכן כל הזמן מה עובר ומה לא. &lt;/p&gt;  &lt;p dir="rtl" align="right"&gt;נותן חיווי ברור ליד כל שורה אם יש לה כיסוי. &lt;/p&gt;  &lt;p dir="rtl" align="right"&gt;טיפים: &lt;/p&gt;  &lt;div dir="rtl" align="right"&gt;   &lt;ol&gt;     &lt;li&gt;לא להתייאש מהקינפוג שלו… זה טיפה מעצבן לפעמים, שווה את המאמץ. &lt;/li&gt;      &lt;li&gt;אם יש מספיק זיכרון – שימוש &lt;a href="http://memory.dataram.com/products-and-services/software/ramdisk" target="_blank"&gt;בRamDisk&lt;/a&gt; והגדרת ה&lt;a href="http://wiki.ncrunch.net/global-configuration.ashx?HL=workspace" target="_blank"&gt;Workspace base path&lt;/a&gt;אלין, מומלץ. &lt;/li&gt;      &lt;li&gt;לשים בפינה למטה את &lt;a href="http://wiki.ncrunch.net/Risk-Progress-Bar.ashx?HL=risk" target="_blank"&gt;הRisk/Progress&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;לתת לו לעבוד. &lt;/li&gt;   &lt;/ol&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1099846" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Unique handler to events using AOP–PostSharp</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/04/24/unique-handler-to-events-using-aop.aspx</link><pubDate>Wed, 25 Apr 2012 03:22:44 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1074139</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=1074139</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2012/04/24/unique-handler-to-events-using-aop.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;p&gt;קורה שמתבצע רישום כפול לאותו אירוע, ברוב המקרים זה לא הרצון המקורי…כמובן לא מדובר בכמה הנדלרים שונים אלא ברישום אותו הנדלר לאותו אירוע. &lt;/p&gt;    &lt;p&gt;זה קורה ממספר סיבות:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;רישום ממתודה סטאטית שנקראת מספר פעמים. &lt;/li&gt;      &lt;li&gt;רישום ממקומות שונים בקוד. (לפעמים ע”י מתכנתים שונים, נתיבים שונים שכל אחד צריך את זה) &lt;/li&gt;      &lt;li&gt;רישום מתוך לולאה. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;וכו’. &lt;/p&gt;    &lt;p&gt;כדי להיפטר מזה ניתן לכתוב קוד שמוסיף לוגיקה לרישום/מחיקה לאירוע. &lt;/p&gt;    &lt;p&gt;בעיקרון האירועים הינם מעטפת (נסתרת) כמו מאפיינים אוטמטיים (Auto properties) ויש להם מתודות נסתרות להוספה והורדה של הנדלרים. &lt;/p&gt;    &lt;p&gt;בתוך הadd ניתן לבצע מעקב אחרי הנרשמים ולמנוע כפילויות. &lt;/p&gt;    &lt;p&gt;זה מקרה קלאסי לAOP - aspect Oriented Programing. &lt;/p&gt;    &lt;p&gt;ב-&lt;a href="http://http://www.sharpcrafters.com/" target="_blank"&gt;PostSharp&lt;/a&gt; ניתן לכתוב אספקט כגון זה די בקלות. &lt;/p&gt;    &lt;p&gt;במקרה זה (אם יש צורך אז ניתן לשים נעילות כדי שזה יהיה Thread safe) . &lt;/p&gt;    &lt;p&gt;עכשיו כל מה שצריך זה לשים UniqueHandlerAspect&amp;#160; מעל הגדרת האירוע. &lt;/p&gt; &lt;/div&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; [Serializable]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; UniqueHandlerAspect : EventInterceptionAspect, IInstanceScopedAspect&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;   {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;       &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Constants and Fields&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;///     The _handlers.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; HashSet&amp;lt;Delegate&amp;gt; _handlers;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;       &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;       &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Public Methods and Operators&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The create instance method. run for every different instance of the aspect. &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;adviceArgs&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The advice args. &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The create instance. &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; CreateInstance(AdviceArgs adviceArgs)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;       {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.MemberwiseClone();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;       }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The on add handler.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;args&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum33"&gt;  33:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The args. &lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum34"&gt;  34:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum35"&gt;  35:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnAddHandler(EventInterceptionArgs args)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum36"&gt;  36:&lt;/span&gt;       {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum37"&gt;  37:&lt;/span&gt;           var handler = args.Handler;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum38"&gt;  38:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._handlers.Contains(args.Handler))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum39"&gt;  39:&lt;/span&gt;           {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum40"&gt;  40:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._handlers.Add(handler);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum41"&gt;  41:&lt;/span&gt;               args.ProceedAddHandler();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum42"&gt;  42:&lt;/span&gt;           }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum43"&gt;  43:&lt;/span&gt;       }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum44"&gt;  44:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum45"&gt;  45:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum46"&gt;  46:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// Method invoked &amp;lt;i&amp;gt;instead&amp;lt;/i&amp;gt; of the &amp;lt;c&amp;gt;Remove&amp;lt;/c&amp;gt; semantic of the event to which the current aspect is applied,&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum47"&gt;  47:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// i.e. when a delegate is removed from this event.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum48"&gt;  48:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum49"&gt;  49:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;args&amp;quot;&amp;gt;Handler arguments.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum50"&gt;  50:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnRemoveHandler(EventInterceptionArgs args)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum51"&gt;  51:&lt;/span&gt;       {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum52"&gt;  52:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._handlers.Contains(args.Handler))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum53"&gt;  53:&lt;/span&gt;           {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum54"&gt;  54:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._handlers.Remove(args.Handler);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum55"&gt;  55:&lt;/span&gt;               args.ProceedRemoveHandler();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum56"&gt;  56:&lt;/span&gt;           }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum57"&gt;  57:&lt;/span&gt;       }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum58"&gt;  58:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum59"&gt;  59:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum60"&gt;  60:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// The runtime initialize instance.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum61"&gt;  61:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum62"&gt;  62:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; RuntimeInitializeInstance()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum63"&gt;  63:&lt;/span&gt;       {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum64"&gt;  64:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._handlers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HashSet&amp;lt;Delegate&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum65"&gt;  65:&lt;/span&gt;       }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum66"&gt;  66:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum67"&gt;  67:&lt;/span&gt;       &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum68"&gt;  68:&lt;/span&gt;   }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;background-color:white;margin:0em;border-left-style:none;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;border-right-style:none;font-size:8pt;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum69"&gt;  69:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1074139" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/AOP/default.aspx">AOP</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/PostSharp/default.aspx">PostSharp</category></item><item><title>WPF authorization</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2011/02/21/wpf-authorization.aspx</link><pubDate>Mon, 21 Feb 2011 17:46:12 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:794485</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=794485</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2011/02/21/wpf-authorization.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;בפרויקט מסוים עלתה דרישה לאפשר מערך הרשאות דינמית בתצוגה, כלומר לייצר מספר (דינמי) של פרופילי משתמש במערכת ולכל אחד לאפשר ביחד לרכיבים מסויימים במסך לאפשר גישה, להגביל לצפייה בלבד או להעלים לגמרי. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;התצוגה מבוססת WPF וצד הלקוח כולו מבוסס PRISM&amp;#160; ו MVVM והשאיפה היא למינימום קוד בתצוגה.&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;דרישות מהמערכת:&lt;/div&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="right"&gt;דינמיות בזמן ריצה של ההרשאות (לא לקודד אותן) &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="right"&gt;שליטה מהVM על ההרשאות (מינימום קוד בתצוגה) &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="right"&gt;יכולת לקבץ מספר מאפיינים עם אותה הרשאת גישה, עם זאת לאפשר שליטה ברמת השדה. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="right"&gt;יכולת לקריאה בלבד/ הסתרה מלאה של מרכיבי תצוגה. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="right"&gt;צימוד של רכיבים קשורים בתצוגה (תוית-&amp;gt; תיבת טקסט) &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="right"&gt;יצירת מספר פרופילים שונים שאינם קבועים מראש. &lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="right"&gt;לטובת העניין כתבתי תשתית מאד פשוטה אבל יעילה המאפשרת עם Attribute פשוט בVM וBehavior בXAML לשלוט על העניין. &lt;/p&gt;  &lt;p align="right"&gt;העיקרון פשוט – מצמידים תוית כלשהיא לשדות בVM. בBehavior מצמידים עם Binding מאפיינים בVM והוא דואג לשלוט בתצוגה. &lt;/p&gt;  &lt;p align="right"&gt;הbehavior יכול להיות מוצמד למיכל של מספר נתונים למשל וכך לשלוט בכולם יחד. בVM התוית יכולה להיות מוצמדת למספר מאפיינים וכך לשלוט בהן כקבוצה. &lt;/p&gt;  &lt;p align="right"&gt;המתכנת צריך לממש ממשק מאד פשוט שלמעשה שואל אותו לגבי תוית מסויימת מהי ההרשאה הנדרשת. את הProvider&amp;#160; הזה מאתחלים עם העלייה של האפליקציה (bootstrapper in prism). מאחוריו ניתן להסתיר מימוש של קבצי XML, שירותים מקוונים וכו’.&amp;#160; &lt;/p&gt;  &lt;p align="right"&gt;חסרון מסויים&amp;#160; זה שReadOnly למעשה מגדיר את רכיב התצוגה כIsEnable=false שזה לא ממש ReadOnly, ע”מ להתגבר על זה בחרתי לאפשר החלפה של DataTemplate מסויים. &lt;/p&gt;  &lt;p align="right"&gt;דוגמא למורכבות של העניין – נניח שיש רשימה של אנשים וניתן לערוך את השם שלהם. במידה והוגדר לקריאה בלבד אם נהפוך את הרשימה לIsEnable=false לא נוכל לגלול או לבחור אנשים משם. ואם הרשימה הזו מקושרת בMaster/Detail לאובייקט אחר אז מאבדים את היכולת הזו. &lt;/p&gt;  &lt;p align="right"&gt;אני מניח שככל שנתקדם ניתקל במקרים מורכבים יותר שידרשו עוד התאמות. &lt;/p&gt;  &lt;p align="right"&gt;בכל אופן העליתי את התשתית הזו לcodeplex עם דוגמא פשוטה ניתן להגיע אליה – ב &lt;a title="http://uiauth.codeplex.com/" href="http://uiauth.codeplex.com/"&gt;http://uiauth.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p align="right"&gt;אשמח לרעיונות נוספים… &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/wlEmoticon-smile_09BDC16B.png" /&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=794485" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Expression+Blend/default.aspx">Expression Blend</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DataBinding/default.aspx">DataBinding</category></item><item><title>OneNote for Iphone</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2011/01/20/onenote-for-iphone.aspx</link><pubDate>Thu, 20 Jan 2011 14:59:11 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:775131</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=775131</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2011/01/20/onenote-for-iphone.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;מיקרוסופט &lt;a href="http://blogs.office.com/b/office-exec/archive/2011/01/18/onenote-mobile-for-iphone-helps-you-free-your-ideas.aspx" target="_blank"&gt;הכריזה&lt;/a&gt; על גרסה של OneNote לאיפון. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;לצערי זה עדיין לא זמין מישראל או מאיזשהו מקום מחוץ לארה”ב.    &lt;br /&gt;זו בערך הההערה הכי פופולארית שם (אפשר אירלנד? אוסטרליה וכו’…) &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=775131" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category></item><item><title>Expert-Exchange remove</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/21/expert-exchange-remove.aspx</link><pubDate>Tue, 21 Dec 2010 16:15:57 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:759198</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=759198</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/21/expert-exchange-remove.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;תופעה מטרידה שנתקלתי בה הרבה היא שבחיפוש בגוגל אני מקבל תוצאות מ expert-exchange שזה אתר דומה לStackOverflow&amp;#160; רק בתשלום. זה מטריד כי יש אפשרות לראות את השאלה אבל בשביל התשובה צריך לשלם…   &lt;br /&gt;לא מעוניין שהאתר הזה יופיע בכלל אצלי על המפה.     &lt;br /&gt;אז מסתבר שיש תוספים שיפתרו את הבעיה עבורנו… &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&lt;a href="https://chrome.google.com/extensions/detail/ddgjlkmkllmpdhegaliddgplookikmjf" target="_blank"&gt;תוסף לכרום&lt;/a&gt; – יותר אינטואיטיבי, קל להוסיף סינונים. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&lt;a href="https://addons.mozilla.org/af/firefox/addon/12305/" target="_blank"&gt;תוסף לפיירפוקס&lt;/a&gt; – פחות נוח, מאפשר חריגים. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;שניהם אגב יעבדו רק בגוגל רגיל ולא בחיפוש המהיר החדש. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;לIE לא מצאתי. &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=759198" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/_DE05E105DE05E805D905DD05_/default.aspx">מסמרים</category></item><item><title>Microsoft keyboard F Lock</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/16/microsoft-keyboard-f-lock.aspx</link><pubDate>Thu, 16 Dec 2010 23:31:01 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:757771</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=757771</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/16/microsoft-keyboard-f-lock.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;למי שמשתמש במקלדת מיקרוסופט, יש את הכפתור המעצבן (לטעמי) F Lock (אי שם מימין למעלה). &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;הכפתור הזה נועד למעשה לשכפל את התפקוד של שורת הFים. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;הכפתור הזה מעצבן כי ברירת המחדל שלו היא כבויה כלומר אין Fים. יש פונקציות אחרות (Open,New&amp;#160; וכו’). &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;מה שמציק הוא שכאשר מכבים את המחשב הוא שוב מתאפס ונשאר כבוי, ואז אני מוצא את עצמי לוחץ F5 לדיבאג וזה לא זז עד שלוחצים עליו. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&amp;#160;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;אז זהו שיש לזה פתרון. לא נכנסתי לעומק העניין אבל ניתן למצוא את ההסבר &lt;a href="http://jtsang.mvps.org/scancode_method.html" target="_blank"&gt;כאן&lt;/a&gt;. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;בכל אופן שינוי קטן ברגיסטרי פותר את העניין לתמיד, למעשה הכפתור נשאר כבוי אבל התפקוד מתהפך. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;בכפוף לסוג המקלדת המדוייק יש להשתמש בקובץ הנכון.&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=757771" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/_DE05E105DE05E805D905DD05_/default.aspx">מסמרים</category></item><item><title>Reuse types with WCF Data Services</title><link>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/16/reuse-types-with-wcf-data-services.aspx</link><pubDate>Thu, 16 Dec 2010 06:49:32 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:757408</guid><dc:creator>Adiel Sharabi</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/adiel_sharabi/rsscomments.aspx?PostID=757408</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/2010/12/16/reuse-types-with-wcf-data-services.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;&lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;כאשר עושים Add service reference לשירות נתונים נוצרים אובייקטים חדשים המייצגים את המודל. זאת בנוסף לפרוקסי (אותו אנחנו בעצם רוצים) המכיל את הנקודות קצה לכל האלמנטים במודל. &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;בWCF – ישנה אפשרות לשימוש חוזר באובייקטים כאשר הן לשרת והן ללקוח יש קישור אליהן.&amp;#160; &lt;/div&gt;  &lt;div dir="rtl" align="right"&gt;   &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/adiel_sharabi/image_62324574.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/adiel_sharabi/image_thumb_37E82EFB.png" width="371" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;עכשיו נניח תצורה מסויימת של פרוייקט. &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;רוצים לעבוד N-tier &lt;a href="http://msdn.microsoft.com/en-us/magazine/ee335715.aspx" target="_blank"&gt;והתבנית הנוחה&lt;/a&gt; ביותר היא Self tracking object &lt;/li&gt;      &lt;li&gt;רוצים למנוע תלויות ב Entity framework – אז מזיזים את הישויות לפרוייקט נפרד. &lt;/li&gt;      &lt;li&gt;רוצים להשתמש בWcf Data services ע”מ לקבל אובייקטים מהשרת. &lt;/li&gt;      &lt;li&gt;רוצים להשתמש גם בשירותים אחרים של WCF כדי להחזיר אובייקטים לשרת (עדכון וכו’) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;התצורה הזו אינה דמיונית, היא מאד הגיונית, לתשאל עם Data Services זה תענוג, אולם שאר הפעולות (עדכון,הוספה,מחיקה) בד”כ דורשות קצת יותר לוגיקה ממה שנוח לעשות עם Data Services. &lt;/p&gt;    &lt;p&gt;הבעיה כמובן היא שגם אם ללקוח יש קישור לפרוייקט של הישויות תהיה לו כפילות של ישויות תחת Namespace אחר. &lt;/p&gt;    &lt;p&gt;ב &lt;a href="http://blogs.msdn.com/b/alexj/archive/2010/01/27/tip-52-how-to-re-use-types-with-the-data-services-client.aspx" target="_blank"&gt;Tip 52&lt;/a&gt;&amp;#160; מוצגת שיטה שלמעשה מיצרת פרוקסי ידנית כדי לעקוף את הבעיה הזו. רק שיש בעיה עם הגישה הזו. זה ידני – כל שינוי בשמות, הוספת/הורדת ישויות מחייב עריכה ידנית. &lt;/p&gt;    &lt;p&gt;לכן הוספתי תבנית TT עם שינויים קלים שעושה את העבודה עבורי. &lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/adiel_sharabi/entry757406.aspx" target="_blank"&gt;מצ”ב פרוייקט לדוגמא.&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;נקודות לתשומת לב - &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;ב TT של הcontext יש תוספת של הNamespace של הישויות (החדש אם הוא שונה) &lt;/li&gt;      &lt;li&gt;ישנו override בDataService כדי לאפשר לMetadata&amp;#160; של השירות לעלות בצורה תקינה. אבל זה נושא לפוסט אחר. &lt;/li&gt;      &lt;li&gt;ב TT של הישויות צריך לתקן את הנתיב ל Edmx. &lt;/li&gt;      &lt;li&gt;יש להוסיף רפרנס ל - System.Data.Services.Client מכיוון שהפרוקסי יורש מDataServiceContext &lt;/li&gt;      &lt;li&gt;ב TT של צד לקוח יש לעדכן נתיב ל Edmx והnamspace לישויות. &lt;/li&gt;      &lt;li&gt;אם נוצר קובץ כפול ואחד עם “1” בסוף – זו איזו תקלה לא ברורה שניתן לתקן (זה רק מעצבן ויזואלית) אם נכנסים לקובץ של הפרוייקט ומשנים שם את הערך של&amp;#160; LastGenOutput שיהיה בלי 1.        &lt;br /&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=757408" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/wcf/default.aspx">wcf</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/Entity+Framwork/default.aspx">Entity Framwork</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/T4/default.aspx">T4</category><category domain="http://blogs.microsoft.co.il/blogs/adiel_sharabi/archive/tags/WCF+Data+Services/default.aspx">WCF Data Services</category></item></channel></rss>