<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5422036137568788209</atom:id><lastBuildDate>Sun, 08 Sep 2024 14:03:14 +0000</lastBuildDate><category>.NET</category><category>Best Practices</category><category>Hello</category><category>XML</category><category>IoC/DI</category><category>Log</category><category>Patterns</category><category>Security</category><category>VisualStudio</category><category>WCF</category><category>DDD</category><category>Diagnostic</category><category>Doc</category><category>Fluent interface</category><category>MVC</category><category>Mock</category><category>ThreadSafe</category><category>UnitTesting</category><category>XSD</category><category>cache</category><category>AOP</category><category>ASP</category><category>Adapter</category><category>Builder</category><category>CodeContract</category><category>Config</category><category>DVCS</category><category>EF</category><category>FIX/FAST</category><category>Fun</category><category>Linq</category><category>MSBuild</category><category>Queueing</category><category>T4</category><category>Versioning</category><category>arduino</category><category>avr</category><category>math</category><category>performance</category><title>handcode</title><description>bool good=true</description><link>http://www.handcode.ru/</link><managingEditor>noreply@blogger.com (Илья Дубаденко)</managingEditor><generator>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-6149476395582313316</guid><pubDate>Sun, 18 Jan 2015 21:07:00 +0000</pubDate><atom:updated>2015-01-19T00:08:52.839+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">arduino</category><category domain="http://www.blogger.com/atom/ns#">avr</category><title>Hello world для ATmega328 + avr-gcc + avrdude (USBasp)</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
Хочу поделиться своим опытом знакомства с микроконтроллером ATmega328. Но сначала небольшое отступление.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Наверное уже все читали или уж точно слышали про Arduino. На мой взгляд, Arduino хорошая платформа для ознакомления с миром микроконтроллеров. Низкий порог вхождения и богатый набор различных библиотек, несомненно, является ключевым достоинством этой платформы. Под словом платформа я понимаю само устройство и штатная IDE с набором библиотек. Но к сожалению, ради обеспечения низкого порога вхождения штатная IDE вынуждена многое делать неявно для программиста. Например, процесс компиляции и прошивки, или даже формирование конечного main-файла с подключением всех &lt;span class=&quot;pl-k&quot;&gt;include&lt;/span&gt;. &lt;span class=&quot;pl-s1&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&lt;/span&gt;&lt;/span&gt; Именно эти неявные действия и создают пробелы в знаниях при изучении платформы. &lt;/blockquote&gt;
Итак, наши цели:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Написать программку на чистом C, которая будет мигать светодиодом (aka &quot;Hello world!&quot; только для МК)&lt;/li&gt;
&lt;li&gt;Собрать прошивку для МК &lt;/li&gt;
&lt;li&gt;Настроить fuses bits нашего МК &lt;/li&gt;
&lt;li&gt;Прошить МК &lt;/li&gt;
&lt;/ol&gt;
Естественно все действия постараемся проделать из-под консоли.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Начнем с железной части.&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;МК ATmega328 (тот самый, что используется и в Arduino)&lt;/li&gt;
&lt;li&gt;Кварц на 16Mhz и два конденсатора на 22пФ&lt;/li&gt;
&lt;li&gt;Светодиод&lt;/li&gt;
&lt;li&gt;Резисторы 1кОм и 10кОм&lt;/li&gt;
&lt;li&gt;Программатор &lt;a href=&quot;http://www.fischl.de/usbasp/&quot;&gt;USBasp &lt;/a&gt;(как устройство)&lt;/li&gt;
&lt;li&gt;Источник питания на 5В.&lt;/li&gt;
&lt;/ol&gt;
Все это необходимо будет подключить по схеме:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8zhThkPL950HCgLbhPUvarXvbRNhlpYI4uEidaHCpjGi0aaEkYAm4LN5fqI9UYww3O239ekFO-8BhkCObTliB0oKJA8gH1PGzafsibr9nzskfIiy0Eq08ja88R_ANPdNdVD3VPNya6k/s1600/schema.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8zhThkPL950HCgLbhPUvarXvbRNhlpYI4uEidaHCpjGi0aaEkYAm4LN5fqI9UYww3O239ekFO-8BhkCObTliB0oKJA8gH1PGzafsibr9nzskfIiy0Eq08ja88R_ANPdNdVD3VPNya6k/s1600/schema.png&quot; height=&quot;280&quot; title=&quot;Схема&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Подготовка программной среды.&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Компилятор &lt;a href=&quot;https://gcc.gnu.org/wiki/avr-gcc&quot;&gt;avr-gcc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Программатор &lt;a href=&quot;http://savannah.nongnu.org/projects/avrdude/&quot;&gt;avrdude &lt;/a&gt;(как софт)&lt;/li&gt;
&lt;/ol&gt;
Для ОС Windows все придется скачать и установить самому руками.&lt;br /&gt;
Для ОС Ubuntu процесс намного проще:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;sudo apt-get install gcc-avr avr-libc binutils-avr&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;sudo apt-get install avrdude &lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Весь наш код будет состоять из одного main.c файла:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/oakio/321ea855f08d22c61ace.js&quot;&gt;&lt;/script&gt;
Теперь необходимо собрать нашу программу: &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;avr-gcc -Wall -Os -mmcu=atmega328p main.c -o main.o&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
После чего необходимо подготовить HEX-образ для загрузки его в МК:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;avr-objcopy -j .text -j .data -O ihex main.o main.hex&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Перед тем как загрузить HEX-образ, МК необходимо настроить, делается это выставлением fuse bits. Установка
 fuse bits одна из самых ответственных частей. Собственно при 
неправильных настройках можно случайно заблокировать свой МК, так что 
будьте особо внимательны! К счастью, выставление fuse bits редкая операция, и требуется обычно лишь один раз.&lt;br /&gt;
Для подбора значений fuse bits я воспользовался&amp;nbsp;&lt;a href=&quot;http://www.engbedded.com/fusecalc/&quot;&gt;калькулятором&lt;/a&gt;. Для нашего случая команда конфигурации выглядит так (16Мгц должно хватить, чтобы помигать светодиодом :)):&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;avrdude -c usbasp -p atmega328p -U lfuse:w:0xff:m -U hfuse:w:0xda:m -U efuse:w:0x05:m&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Собственно загрузка HEX-образа в МК:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;avrdude -p atmega328p -c usbasp -U flash:w:main.hex:i&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Если все шаги были пройдены успешно, то после включения МК мы увидим мигающий светодиод.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;PS:&lt;/b&gt; Код проекта выложил на &lt;a href=&quot;https://github.com/oakio/avr_blink&quot;&gt;github&lt;/a&gt;, в который включил &lt;a href=&quot;https://github.com/oakio/avr_blink/blob/master/makefile&quot;&gt;makefile &lt;/a&gt;для удобства сборки и прошивки.&lt;br /&gt;
Советую обратить внимание на команду:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;b&gt;avr-objdump -h -S main.o &lt;span class=&quot;pl-k&quot;&gt;&amp;gt;&lt;/span&gt; main.lss&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
</description><link>http://www.handcode.ru/2015/01/hello-world-atmega328-avr-gcc-avrdude.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8zhThkPL950HCgLbhPUvarXvbRNhlpYI4uEidaHCpjGi0aaEkYAm4LN5fqI9UYww3O239ekFO-8BhkCObTliB0oKJA8gH1PGzafsibr9nzskfIiy0Eq08ja88R_ANPdNdVD3VPNya6k/s72-c/schema.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-8742852368423431588</guid><pubDate>Tue, 23 Oct 2012 20:14:00 +0000</pubDate><atom:updated>2012-10-24T00:14:22.604+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><title>Инфраструктурный код</title><description>&lt;p&gt;Не секрет, что в процессе разработки многие программисты стараются разделять свой код на две категории: бизнес код и инфраструктурный код. Из названий категорий очевидно следует, что бизнес код должен решать задачи поставленные Вам от бизнеса, и именно этот код приносит потребительскую ценность Вашего ПО как продукта. И инфраструктурный, берущий на себя технические детали реализации не относящиеся к бизнесу, и позволяя Вам в большей степени сосредоточиться на бизнес цели. &lt;/p&gt;

&lt;p&gt;Инфраструктурный код полностью зависит от инфраструктуры проекта. Объем инфраструктурного кода напрямую зависит от того, в какой степени Вы используете функциональные возможности низлежащей инфраструктуры, перекладывая на нее свои обязанности. Если принять во внимание тот факт, что инфраструктурный код не несет прямой потребительской ценности, то можно сделать очевидный (хотя практика доказывает обратное) вывод, что в рамках имеющейся инфраструктуры необходимо использовать ее функциональные возможности настолько, насколько это возможно, и по возможности избегать создания новой инфраструктуры.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p&gt;Чтобы лучше понять, что я имел в виду приведу простой пример из практики.&lt;/p&gt;

&lt;p&gt;Пример: &lt;br/&gt; Имеется система обмена сообщениями стандарта JMS и пусть каждое сообщение имеет тело сообщения (body), тип (type), имя очереди для ответа (replyTo) и имя отправителя (application name). Разработчику предлагается предложить техническую реализацию структуры сообщения.&lt;/p&gt;

&lt;p&gt;Неправильный путь начинается с того, что разработчик придумывает свой envelop, со своим header и body секциями для хранения соответствующих полей сообщения. Продолжается написанием сложных алгоритмов анализа своего envelop&#39;а, фактически изобретая инфраструктуру над инфраструктурой. И заканчивается все legacy кодом.&lt;/p&gt;

&lt;p&gt;Правильным решением здесь будет воспользоваться уже готовой инфраструктурой: поля type и replyTo положить в стандартные jmsType и jmsReplyTo соответственно. С appName немного сложнее, так как для него нет стандартного jms заголовка, поэтому appName следует поместить в свойство сообщения, опять же стандартное средство инфраструктуры. С body все понятно, тут сложно промахнуться.&lt;/p&gt;

&lt;p&gt;Аналогичный пример можно привести и для SOAP сообщений. На самом деле примеров игнорирования возможностей инфраструктуры море.&lt;/p&gt;

&lt;p&gt;Итак, если у Вас имеется некая инфраструктура, изучите ее возможности. Большинство &quot;велосипедов&quot; получается из-за незнания возможностей инфраструктуры. 
Если так получается, что возможностей инфраструктуры недостаточно для решения конкретной задачи, то у Вас есть несколько путей решения этой проблемы:
&lt;ol&gt;
&lt;li&gt;Выбрать другую инфраструктуру. Это довольно радикальное решение, но все же.&lt;/li&gt;
&lt;li&gt;Найти готовый framework под текущую инфраструктуру, реализующий недостающую функциональность 
(например NServiceBus позволяет реализовать функционал выполнения долгих бизнес процессов (известных как SAGA) в  инфраструктуре MSMQ, в которой понятие SAGA отсутствует)&lt;/li&gt;
&lt;li&gt;Реализовать самому.&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
</description><link>http://www.handcode.ru/2012/10/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-3415488161203366147</guid><pubDate>Wed, 28 Mar 2012 07:06:00 +0000</pubDate><atom:updated>2015-01-20T22:45:43.178+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">DVCS</category><category domain="http://www.blogger.com/atom/ns#">MSBuild</category><category domain="http://www.blogger.com/atom/ns#">Versioning</category><title>Семантическое версионирование в DVCS Mercurial</title><description>&lt;p&gt;Эта статья о том, как я наладил семантическое версионирование (semantic versioning) в своем проекте на базе DVCS Mercurial (можно читать как Git). На хабре есть отличный перевод про &lt;a href=&quot;http://habrahabr.ru/post/134033/&quot;&gt;Семантическое управление версиями&lt;/a&gt;, советую начать с него.&lt;/p&gt;&lt;p&gt;В качестве хранилища кода, я выбрал mercurial. Помимо функции хранилища кода, mercurial будет выступать еще и как провайдер версий, это означает, что запрашивать текущую семантическую версию (&lt;strong&gt;Major&lt;/strong&gt;.&lt;strong&gt;Minor&lt;/strong&gt;.&lt;strong&gt;Patch&lt;/strong&gt;) мы будем именно у него.&lt;/p&gt;&lt;p&gt;Итак, рассмотрим пару &lt;strong&gt;Major&lt;/strong&gt;.&lt;strong&gt;Minor&lt;/strong&gt;. Обычно эта пара всегда задается вручную в момент релиза, и самый простой способ это сделать - пометить руками нужный сhangeset тегом, содержащим версию релиза (например: 1.4, или v1.4, но не 1.4.3, так как path мы договоримся вычислять).&lt;br /&gt;
&lt;p&gt;С &lt;strong&gt;Patch&lt;/strong&gt; все намного сложнее. Наша цель, добиться чтобы при каждой фиксации(commit) изменений кодовой базы автоматически бы инкрементировался path-номер. Это примерно означало бы, что path будет равен числу фиксаций в текущем релизе (например: 1.4.17 - 17-ая фиксация в релизе 1.4, но в то же время 1.5.0 уже новый релиз, с новой path-нумерацией). Но здесь не стоит забывать один факт: мы ведь работаем с DVCS и у нас нет единого &quot;брокера&quot; path-номеров...&lt;/p&gt;&lt;p&gt;В интернете я нашел несколько вариантов решения этой задачи (&lt;a href=&quot;http://stackoverflow.com/questions/4072861/mercurial-template-latesttaglatesttagdistance-doesnt-work&quot;&gt;SO&lt;/a&gt;, &lt;a href=&quot;http://www.rsdn.ru/forum/janus/4514398.flat.aspx&quot;&gt;RSDN&lt;/a&gt;), где в основном предлагалось использовать число, полученное как {latesttagdistance}, но можно заметить, что {latesttagdistance} перестает работать в общем случае, когда тег может содержать произвольный текст. Но эта идея мне очень понравилась, и я начал искать универсальное решение. И вскоре решение было найдено.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Я предлагаю в качестве path-номера брать разницу между номером ревизии текущего changeset-а (замечу, что это не всегда tip) и номером ревизии changeset-а, имеющего &lt;u&gt;тэг с релизной версией&lt;/u&gt; и являющегося &lt;u&gt;ближайшим предком&lt;/u&gt; по отношению к текущему changeset-у.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;На текущий момент, при таком подходе мне удалось достичь желаемого семантического версионирования своих проектов.&lt;/p&gt;&lt;p&gt;Теперь осталось все это как-то оформить. В конечном же счете, я преследовал цель автоматической генерации файла AssemblyInfo.cs на основе номера версии полученной от mercurial до начала сборки проекта, и с последующей сборкой. Очевидным решением здесь было сделать Custom MSBuild Task/Target, и в итоге появился проект &lt;a href=&quot;https://bitbucket.org/oakio/devme.msbuildtasks&quot;&gt;Devme.MSBuildTasks&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;b&gt;Коротко о Devme.MSBuildTasks (текущая версия 0.3.0)&lt;/b&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Какие системы контроля версий поддерживает библиотека?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Пока только для mercurial.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Как я могу начать использовать это в своем проекте?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Необходимо выполнить 3 простых шага:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Шаг 1.&lt;/b&gt; Используя Nuget, &lt;a href=&quot;http://nuget.org/packages/Devme.MSBuildTasks&quot;&gt;установить/скачать&lt;/a&gt; библиотеку к себе в проект.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Шаг 2.&lt;/b&gt; Создать в каталоге Properties (если использовали nuget, то файл шаблон будет создан автоматически) файл шаблон следующего содержания (за основу можно взять Ваш текущий файл AssemblyInfo.cs):&lt;/p&gt;
&lt;pre&gt;&lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;using&lt;/span&gt; System&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;Reflection&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
 
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyTitle&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;todo&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyDescription&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;todo&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyCompany&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;todo&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyProduct&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;todo&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyCopyright&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;Copyright © todo&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
 
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyVersion&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;${major}.${minor}.${path}&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyFileVersion&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;${major}.${minor}.${path}&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;assembly&lt;span style=&#39;color:#808030; &#39;&gt;:&lt;/span&gt; AssemblyInformationalVersionAttribute&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;${major}.${minor}.${path}-${branch} ${hash|short}&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;/pre&gt;
Формат шаблона думаю Вам понятен, здесь в качестве ${some} будут подставлены соответствующие значения взятые из mercurial (см &lt;a href=&quot;https://bitbucket.org/oakio/devme.msbuildtasks/wiki&quot;&gt;wiki&lt;/a&gt;). У себя я называю этот файл AssemblyInfo.cs.template.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Шаг 3.&lt;/b&gt; Открыть в блокноте файл проекта (*.csproj) и добавить в самом конце пару тэгов (или расширить существующую цель BeforeBuild), указав правильный путь к Devme.MSBuildTasks.dll:&lt;/p&gt;
&lt;pre&gt;
&lt;span style=&#39;color:#a65700; &#39;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#39;color:#5f5035; &#39;&gt;UsingTask&lt;/span&gt; 
    &lt;span style=&#39;color:#274796; &#39;&gt;TaskName&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;SemanticVersioningTask&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt; 
    &lt;span style=&#39;color:#274796; &#39;&gt;AssemblyFile&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;ПУТЬ К ФАЙЛУ Devme.MSBuildTasks.dll&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt; &lt;span style=&#39;color:#a65700; &#39;&gt;/&gt;&lt;/span&gt;
&lt;span style=&#39;color:#a65700; &#39;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#39;color:#5f5035; &#39;&gt;Target&lt;/span&gt; &lt;span style=&#39;color:#274796; &#39;&gt;Name&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;BeforeBuild&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#a65700; &#39;&gt;&gt;&lt;/span&gt;
    &lt;span style=&#39;color:#a65700; &#39;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#39;color:#5f5035; &#39;&gt;semanticversioningtask&lt;/span&gt; 
        &lt;span style=&#39;color:#274796; &#39;&gt;TemplateFilePath&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;Properties/AssemblyInfo.cs.template&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt; 
        &lt;span style=&#39;color:#274796; &#39;&gt;OutputFilePath&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;Properties/AssemblyInfo.cs&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;&lt;/span&gt; &lt;span style=&#39;color:#a65700; &#39;&gt;/&gt;&lt;/span&gt;
&lt;span style=&#39;color:#a65700; &#39;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#39;color:#5f5035; &#39;&gt;Target&lt;/span&gt;&lt;span style=&#39;color:#a65700; &#39;&gt;&gt;&lt;/span&gt;
&lt;/pre&gt;
Все готово!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Заключение&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Следует помнить, что каждый раз, во время сборки проекта, файл AssemblyInfo.cs будет генерироваться автоматически, поэтому его можно(надо) исключить из кодовой базы добавив в .hgignore.&lt;/li&gt;
&lt;li&gt;Так же не рекомендуется вносить в файл AssemblyInfo.cs любые изменения. Все изменения надо делать в шаблоне AssemblyInfo.cs.template.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bitbucket.org/oakio/devme.msbuildtasks&quot;&gt;Исходники&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bitbucket.org/oakio/devme.msbuildtasks/wiki/&quot;&gt;Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;b&gt;Ссылки:&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://semver.org&quot;&gt;Semantic Versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://solyutor.blogspot.com/2012/02/assemblyversion-git.html&quot;&gt;AssemblyVersion и git. Давайте жить дружно.&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;http://habrahabr.ru/post/140835/&quot;&gt;Полуавтоматическое выставление номера версии с помощью git&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ol&gt;&lt;p&gt;Всем приятного использования!&lt;/p&gt;</description><link>http://www.handcode.ru/2012/03/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4379573811613230830</guid><pubDate>Tue, 13 Mar 2012 08:36:00 +0000</pubDate><atom:updated>2012-03-13T12:38:53.969+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Diagnostic</category><title>Stopwatch. Новые идеи.</title><description>&lt;p&gt;Как-то давно я написал статью &lt;a href=&quot;http://www.handcode.ru/2010/10/stopwatch.html&quot;&gt;&quot;Пишем обертку для Stopwatch&quot;&lt;/a&gt;, в которой рассказал как удобно было бы использовать стандартный класс Stopwatch из System.Diagnostics, сделав для него IDisposable обертку. И вот наконец, у меня появились новые идеи и свободное время и я решил вернуться к этой теме и немного ее доработать.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. API&lt;/strong&gt;. Я решил сделать единую точку входа - статический класс StopwatchManager со статическим методом Start. Все очень просто и понятно:&lt;/p&gt;&lt;pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; (StopwatchManager.Start(elapsed =&amp;gt; Console.WriteLine(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Elapsed: {0}&lt;/span&gt;&quot;, elapsed)))
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;{
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;Thread.Sleep(2345);
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;2. Регионы (&lt;font color=&quot;#ff0000&quot;&gt;new!&lt;/font&gt;).&lt;/strong&gt; Как часто Вам требовалось узнать не только текущее время выполнения блока, а например, еще и общее или суммарное время выполнения, либо узнать сколько раз блок выполнился, либо узнать минимальное, максимальное или среднее время выполнения? Теперь это стало проще благодаря именованным регионам: &lt;/p&gt;&lt;pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; (StopwatchManager.Start(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;region&lt;/span&gt;&quot;, elapsed =&amp;gt; 
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;Console.WriteLine(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Third. &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Elapsed: {0}, &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Total: {1}, &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Count: {2}, &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Min: {3}, &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Max: {4}, &lt;/span&gt;&quot; +
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Avg: {5}&lt;/span&gt;&quot;,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Current,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Total,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Count,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Min,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Max,
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;elapsed.Avg
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;)))
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;{
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;Thread.Sleep(500);
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px&quot;&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Здесь “region” это идентификатор региона, задав его мы указываем, что хотим собирать статистику для помеченного блока кода. В статистику входят: Current – текущее, Avg - среднее, Min – минимальное, Max – максимальное, Total – общее время выполнения, Count – количество прогонов.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;3. NuGet package (&lt;font color=&quot;#ff0000&quot;&gt;new!&lt;/font&gt;).&lt;/strong&gt; Для удобства использования, я собрал все это в NuGet пакет, который можно скачать &lt;a href=&quot;http://nuget.org/packages/Devme.Diagnostics&quot;&gt;здесь&lt;/a&gt;, или через консоль:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font face=&quot;Courier New&quot;&gt;PM&amp;gt; Install-Package Devme.Diagnostics &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/oakio/devme.diagnostics&quot;&gt;Исходники&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://bitbucket.org/oakio/devme.diagnostics/wiki/Home&quot;&gt;Wiki&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Всем приятного использования!&lt;/p&gt;</description><link>http://www.handcode.ru/2012/03/stopwatch.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-8332313993740569800</guid><pubDate>Tue, 22 Nov 2011 21:05:00 +0000</pubDate><atom:updated>2011-11-23T01:05:31.285+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Adapter</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">FIX/FAST</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><title>Adapter pattern. Понимание важности.</title><description>Перед большинством проектов рано или поздно встает главный вопрос: &quot;Использовать стороннюю компоненту или реализовать свою?&quot;, и как это часто бывает, по причине того что использовать уже существующее гораздо проще, чем создавать это заново мы выбираем уже готовое решение.&lt;br /&gt;
&lt;br /&gt;
Предположим, мы решили использовать уже готовую компоненту, тогда остается выбрать какую именно, но если выбор велик, то перед нами возникает проблема выбора, так как у каждой компоненты различные интерфейсы, различные характеристики по памяти/скорости работы, надежность, различная поддержка со стороны поставщика и цена. На изучении каждой у нас просто нет времени... &lt;br /&gt;
&lt;br /&gt;
Итак, пришло время вспомнить о существовании такого шаблона проектирования как &quot;Адаптер&quot; (&lt;a href=&quot;http://en.wikipedia.org/wiki/Adapter_pattern&quot;&gt;Adapter pattern&lt;/a&gt;). Я не буду здесь рассказывать про этот шаблон проектирования, а просто постараюсь выделить главную идею:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Всегда оборачивайте стороннюю компоненту своим интерфейсом и адаптируйте ее под себя.&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Первая причина, почему это стоит делать очевидна - это &lt;b&gt;устранение жестких зависимостей&lt;/b&gt; на стороннюю компоненту, а учитывая, что у зависимостей есть один неприятный момент: с ростом проекта они тоже разрастаются и чем дальше тем сложнее от них избавиться, и в конце концов можно стать &quot;заложником&quot; сторонней компоненты. Казалось бы простое правило, но на практике периодически сталкиваешься с обратным, да и сам порой забываешь обернуть, например, какой-нибудь logger, serializer(json, xml, yaml) или DI/IoC-контейнер, в надежде, что этот инструмент ты не сменишь никогда в проекте. &lt;br /&gt;
&lt;br /&gt;
Вторая причина - это &lt;b&gt;адаптация компоненты &quot;под себя&quot;&lt;/b&gt;. Адаптируете компоненту таким образом, чтобы Вам было удобно ее использовать.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Один из примеров из личного опыта.&lt;br /&gt;
Не так давно, я занимался проектированием и реализацией сервиса получения финансовой информации в режиме реального времени с фондовых бирж (РТС и ММВБ). В качестве протокола взаимодействия с серверами бирж использовался стандартный (&lt;a href=&quot;http://en.wikipedia.org/wiki/FIX_protocol&quot;&gt;Financial Information eXchange&lt;/a&gt; или &lt;a href=&quot;http://fixprotocol.org/&quot;&gt;FIX/FAST&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Изучив спецификацию протокола FIX (и его оптимизацию FAST), было принято решение не писать свой парсер сообщений, а использовать уже готовую библиотеку, реализующую FIX/FAST в полной мере. На рынке (да и в opensource) тогда было &lt;a href=&quot;http://fixprotocol.org/products/&quot;&gt;несколько предложений&lt;/a&gt;&quot;, но вот времени чтобы изучить и выбрать подходящую библиотеку (быстродействие/поддержка/удобство использования) у меня тогда не было (выпуск первого рабочего прототипа поджимал все сроки). Тогда я выбрал одну из библиотек; выделил общие требования к библиотеке в виде нескольких интерфейсов: IFixMessage, IFixGroup, IFixSession, IFixEngine, IFixMessageReader, IFixMessageWriter, IFixMessageBuilder; реализовал адаптер. Важно отметить тот факт, что на практике в 80% случаев Вам потребуется лишь 20% функционала, который предлагает сама библиотека, и в этом случае Ваши интерфейсы получаются легкими (ничего &quot;лишнего&quot;). &lt;br /&gt;
&lt;br /&gt;
Когда прототип был готов и запущен в тестовом режиме, оказалось, что библиотека не удовлетворяет нас по критерию быстродействия. Естественно было принято решение отказаться от данной библиотеки и выбирать другую, для которой мне вновь пришлось написать обертку. Да, я потратил время на написание новой обертки, но зато я сэкономил значительно больше времени не переписывая весь сервис под новое API новой библиотеки, тем более, что остальная часть сервиса была отлажена и работала. &lt;br /&gt;
&lt;br /&gt;
Благодаря такому подходу, мы достигли высокой гибкости в выборе сторонних компонент под проект, при минимальных затратах.</description><link>http://www.handcode.ru/2011/11/adapter-pattern.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1336617322697669011</guid><pubDate>Wed, 31 Aug 2011 16:11:00 +0000</pubDate><atom:updated>2011-08-31T20:14:00.719+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Mock</category><title>Mock для ICloneable типов</title><description>Буквально недавно я столкнулся с задачей, суть которой заключалась в том, чтобы создать mock объект реализующий интерфейс ICloneable, например средствами Moq. &lt;br /&gt;
В моей ситуации, было все просто: метод Clone должен возвращать объект (которого на самом деле нет), с наперед известными данными (которые не подлежали бы изменениям). Для наглядности лучше привести исходный код. &lt;br /&gt;
Пусть это будет следующий интерфейс:&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;ICloneable&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1085;&amp;#1077;&amp;#1082;&amp;#1086;&amp;#1077; &amp;#1073;&amp;#1080;&amp;#1079;&amp;#1085;&amp;#1077;&amp;#1089;-&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; Value { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/div&gt;И для этого интерфейса, построим mock объект реализующий его. &lt;br /&gt;
Итак, тесты вперед, поэтому напишем простой unit-test для метода Clone:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;TestMethod&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; CloneTest()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; original = MakeMockCloneableSome();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1082;&amp;#1072;&amp;#1078;&amp;#1077;&amp;#1084;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1080; &amp;#1091; &amp;#1082;&amp;#1083;&amp;#1086;&amp;#1085;&amp;#1080;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; Clone &amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1072;&amp;#1077;&amp;#1090; &amp;#1082;&amp;#1072;&amp;#1082; &amp;#1085;&amp;#1072;&amp;#1076;&amp;#1086;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; clone = (&lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt;)((&lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt;)((&lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt;)original.Clone()).Clone()).Clone();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1080;&amp;#1084;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1073;&amp;#1080;&amp;#1079;&amp;#1085;&amp;#1077;&amp;#1089; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1074;&amp;#1087;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1077;&amp;#1090;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Assert&lt;/span&gt;.AreEqual(original.Value, clone.Value);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1080;&amp;#1084;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1101;&amp;#1090;&amp;#1086; 2 &amp;#1086;&amp;#1090;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Assert&lt;/span&gt;.IsFalse(&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;.ReferenceEquals(original, clone));&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/div&gt;В тесте я трижды вызывают метод Clone для того, чтобы продемонстрировать, что и у клонированного объекта метод Clone тоже работает, это важно.&lt;br /&gt;
Осталось реализовать метод MakeMockCloneableSome():&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt; MakeMockCloneableSome()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; mock = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ISome&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1076;&amp;#1077;&amp;#1089;&amp;#1100; &amp;#1087;&amp;#1088;&amp;#1080;&amp;#1074;&amp;#1099;&amp;#1095;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1085;&amp;#1072;&amp;#1084; mock &amp;#1073;&amp;#1080;&amp;#1079;&amp;#1085;&amp;#1077;&amp;#1089; &amp;#1083;&amp;#1086;&amp;#1075;&amp;#1080;&amp;#1082;&amp;#1080;...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mock&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Setup(c =&amp;gt; c.Value)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Returns(123);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048;&amp;#1089;&amp;#1082;&amp;#1086;&amp;#1084;&amp;#1099;&amp;#1081; mock &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;&amp;#1072; ICloneable.Clone()&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mock&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Setup(c =&amp;gt; c.Clone())&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Returns(MakeMockCloneableSome);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; mock.Object;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/div&gt;</description><link>http://www.handcode.ru/2011/08/mock-iclonable.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4606093791756327998</guid><pubDate>Thu, 12 May 2011 14:13:00 +0000</pubDate><atom:updated>2011-05-14T19:29:20.632+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">CodeContract</category><title>Проверяем входные данные</title><description>Все программисты знают, что пришедшие из внешнего источника данные всегда надо проверять. Например в качестве входного параметра для метода (свойства, конструктора), может приходить ссылка, которую нужно проверить на null, число, которое должно быть из определенного диапазона, или определенного вида строка. Несмотря на то, что по этому поводу даже существует методика разработки через &lt;a href=&quot;http://en.wikipedia.org/wiki/Design_by_contract&quot;&gt;Code Contracts&lt;/a&gt;, по-прежнему, с высокой вероятностью в проекте можно встретить код проверки на null аналогичный следующему:&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Bar&lt;/span&gt; {}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Bar&lt;/span&gt; _bar;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; Foo(&lt;span style=&quot;color: #2b91af;&quot;&gt;Bar&lt;/span&gt; bar)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// bar &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1077;&amp;#1090; &amp;#1073;&amp;#1099;&amp;#1090;&amp;#1100; null&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (bar == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ArgumentNullException&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _bar = bar;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
С ростом проекта, подобных мест становиться все больше, и контроллировать создание исключений стоновиться сложнее. Одно из решений проблемы (для тех, кто пока еще не перешел на &lt;a href=&quot;http://research.microsoft.com/en-us/projects/contracts/&quot;&gt;Code Contracts&lt;/a&gt;), сделать процесс создания исключений более централизованным, а именно в определенном классе - Guard (я остановился на названии Guard, но встречаются еще Assert, Check (проект KIGG &lt;a href=&quot;http://kigg.codeplex.com/SourceControl/changeset/view/3a9b436eace5#Source%2fCore%2fHelper%2fCheckArgument.cs&quot;&gt;CheckArgument.cs&lt;/a&gt;)):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Guard&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; T AssertNotNull&amp;lt;T&amp;gt;(T paramValue, &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; paramName) &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (paramValue == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ArgumentNullException&lt;/span&gt;(paramName);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; paramValue;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Принцип работы Guard следующий: если входной параметр удовлетворяет некому условию, то Guard пропускает параметр дальше, если нет, то будет сгенерированно исключение:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Bar&lt;/span&gt; _bar;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; Foo(&lt;span style=&quot;color: #2b91af;&quot;&gt;Bar&lt;/span&gt; bar)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// bar &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1077;&amp;#1090; &amp;#1073;&amp;#1099;&amp;#1090;&amp;#1100; null&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _bar = &lt;span style=&quot;color: #2b91af;&quot;&gt;Guard&lt;/span&gt;.AssertNotNull(bar, &lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Итак, за проверку входных параметров у нас отвечает Guard, поэтому вся логика проверки (в том числе более и сложная) не будет присутствовать в основном классе, а будет вынесена в Guard, что сохраняет компактность кода. &lt;br /&gt;
Во-вторых, мы получили удобный механизм контроля создания исключения, например мы легко сможем добавлять свои типы исключений или менять текст исключений и прочее. &lt;br /&gt;
И в-третьих, можно сделать так, чтобы Guard сам отдельно сообщал об исключениях (нарушение контракта):&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Guard&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; T AssertNotNull&amp;lt;T&amp;gt;(T paramValue, &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; paramName) &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (paramValue == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;ArgumentNullException&lt;/span&gt; ex = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ArgumentNullException&lt;/span&gt;(paramName);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OnAlert(ex); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1089;&amp;#1086;&amp;#1086;&amp;#1073;&amp;#1097;&amp;#1080;&amp;#1084; &amp;#1086;&amp;#1073; &amp;#1080;&amp;#1089;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1080;, &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1080;&amp;#1084;&amp;#1077;&amp;#1088; &amp;#1089;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1100; &amp;#1074;&amp;#1086; &amp;#1074;&amp;#1085;&amp;#1091;&amp;#1090;&amp;#1088;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1080;&amp;#1081; &amp;#1083;&amp;#1086;&amp;#1075;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; ex;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; paramValue;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Так же иногда бывает удобно пометить Assert методы специальным атрибутом:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;DebuggerStepThrough&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; T AssertNotNull&amp;lt;T&amp;gt;(T paramValue, &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; paramName) &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; T : &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
PS: Топик навеян статьей &lt;a href=&quot;http://habrahabr.ru/blogs/programming/118934/&quot;&gt;habrahabr: Концепция баррикады&lt;/a&gt;.</description><link>http://www.handcode.ru/2011/05/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-8366630706235166469</guid><pubDate>Thu, 14 Apr 2011 08:34:00 +0000</pubDate><atom:updated>2011-04-14T12:38:51.304+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">AOP</category><category domain="http://www.blogger.com/atom/ns#">IoC/DI</category><title>AOP средствами Unity 2.0</title><description>В этой статье рассмотрим простой пример реализации AOP (Aspect-Oriented Programming) средствами Unity 2.0. Итак, Unity представляет собой DI/IoC контейнер, с возможностью вносить в него новую функциональность или поведение через стандартные или пользовательские расширения (Extentions).Благодаря этой возможности Unity, мы можем написать свое или воспользоваться уже готовым расширением и реализовать AOP в нашем .NET приложении. Стандартный подход при реализации AOP средствами Unity является использование перехватчика (Microsoft.Practices.Unity.Interception) вызова.&lt;br /&gt;
Unity 2.0 предоставляет нам три вида перехвата: &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;InterfaceInterceptor для перехвата методов интерфейса&lt;/li&gt;
&lt;li&gt;VirtualMethodInterceptor для перехвата виртуальных методов&lt;/li&gt;
&lt;li&gt;TransparentProxyInterceptor для перехвата методов у объектов типа MarshalByRefObject&lt;/li&gt;
&lt;/ol&gt;Принцип работы перехватчика очень простой. Когда мы делаем resolve-запрос к Unity контейнеру мы получаем динамически сгенерированный прокси-объект, делегирующий искомый тип. Функционально прокси устроен следующим образом: ПЕРЕД тем и ПОСЛЕ того, как прокси передаст вызов на искомый объект, он выполнит код перехватчика (на практике обычно это pipe из нескольких обработчиков, реализующих интерфейс ICallHandler), передав ему все необходимые параметры вызова. Этого вполне достаточно для реализации AOP поведения. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Для простоты продемонстрирую это на примере: предположим нам необходимо реализовать транзакционный метод (метод помеченный атрибутом [TransactionMethod] будет автоматически выполняться в транзакции, см атрибут [Transaction] в Spring.NET).&lt;br /&gt;
Рассмотрим интерфейс и его имплементацию. В интерфейсе у нас имеется метод, декларативно(!) помеченный как транзакционный. Имплементация по сути не важна.&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IAccountService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1061;&amp;#1086;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1095;&amp;#1090;&amp;#1086;&amp;#1073;&amp;#1099; &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; Withdraw &amp;#1074;&amp;#1099;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1085;&amp;#1103;&amp;#1083;&amp;#1089;&amp;#1103; &amp;#1087;&amp;#1086;&amp;#1076; &amp;#1090;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1077;&amp;#1081;,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1101;&amp;#1090;&amp;#1086;&amp;#1084;&amp;#1091; &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1077;&amp;#1075;&amp;#1086; &amp;#1089;&amp;#1087;&amp;#1077;&amp;#1094;&amp;#1080;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1084; &amp;#1072;&amp;#1090;&amp;#1088;&amp;#1080;&amp;#1073;&amp;#1091;&amp;#1090;&amp;#1086;&amp;#1084;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionMethod&lt;/span&gt;()]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Withdraw(&lt;span style=&quot;color: blue;&quot;&gt;decimal&lt;/span&gt; amount);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;AccountService&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IAccountService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Withdraw(&lt;span style=&quot;color: blue;&quot;&gt;decimal&lt;/span&gt; amount)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (amount &amp;lt; 0 || amount &amp;gt; 1000)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;amount&amp;quot;&lt;/span&gt;);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Собственно атрибут. Видно, что он наследуется от HandlerAttribute, именно атрибуты такого типа по-умолчанию и обрабатываются перехватчиком.&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;AttributeUsage&lt;/span&gt;(&lt;span style=&quot;color: #2b91af;&quot;&gt;AttributeTargets&lt;/span&gt;.Method, AllowMultiple = &lt;span style=&quot;color: blue;&quot;&gt;false&lt;/span&gt;)]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionMethodAttribute&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;HandlerAttribute&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICallHandler&lt;/span&gt; CreateHandler(&lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; container)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1093;&amp;#1074;&amp;#1072;&amp;#1090;&amp;#1095;&amp;#1080;&amp;#1082; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1082;&amp;#1072;&amp;#1078;&amp;#1076;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1072;&amp;#1090;&amp;#1088;&amp;#1080;&amp;#1073;&amp;#1091;&amp;#1090;&amp;#1072; HandlerAttribute,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1090; &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; CreateHandler, &amp;#1082;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1086;&amp;#1079;&amp;#1074;&amp;#1088;&amp;#1072;&amp;#1097;&amp;#1072;&amp;#1077;&amp;#1090; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1082;&amp;#1088;&amp;#1077;&amp;#1090;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1095;&amp;#1080;&amp;#1082; ICallHandler.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionMethodCallHandler&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Вся логика сосредоточена в обработчике вызова ICallHandler.Invoke:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionMethodCallHandler&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;ICallHandler&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1043;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; &amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1095;&amp;#1080;&amp;#1082;&amp;#1072; ICallHandler.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IMethodReturn&lt;/span&gt; Invoke(&lt;span style=&quot;color: #2b91af;&quot;&gt;IMethodInvocation&lt;/span&gt; input, &lt;span style=&quot;color: #2b91af;&quot;&gt;GetNextHandlerDelegate&lt;/span&gt; getNext)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IMethodReturn&lt;/span&gt; result;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1086;&amp;#1090;&amp;#1082;&amp;#1088;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1090;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1102;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionScope&lt;/span&gt; transaction = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionScope&lt;/span&gt;())&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = getNext()(input, getNext);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (result.Exception == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080;&amp;#1089;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1081; &amp;#1085;&amp;#1077; &amp;#1074;&amp;#1086;&amp;#1079;&amp;#1085;&amp;#1080;&amp;#1082;&amp;#1083;&amp;#1086;, &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1096;&amp;#1080;&amp;#1084; &amp;#1090;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1102;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; transaction.Complete();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; result;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; Order { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Продемонстрируем наш пример:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;[] args)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; container = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityContainer&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1072;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1084; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityConfigurationSection&lt;/span&gt; section = (&lt;span style=&quot;color: #2b91af;&quot;&gt;UnityConfigurationSection&lt;/span&gt;)&lt;span style=&quot;color: #2b91af;&quot;&gt;ConfigurationManager&lt;/span&gt;.GetSection(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;unity&amp;quot;&lt;/span&gt;);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; section.Configure(container);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1080;&amp;#1084; &amp;#1091; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088;&amp;#1072; IAccountService.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IAccountService&lt;/span&gt; service = container.Resolve&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;IAccountService&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1081; service - &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1082;&amp;#1089;&amp;#1080;-&amp;#1082;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089; &amp;#1076;&amp;#1077;&amp;#1083;&amp;#1077;&amp;#1075;&amp;#1080;&amp;#1088;&amp;#1091;&amp;#1102;&amp;#1097;&amp;#1080;&amp;#1081; AccountService.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1045;&amp;#1089;&amp;#1083;&amp;#1080; &amp;#1084;&amp;#1099; &amp;#1087;&amp;#1086;&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1091;&amp;#1077;&amp;#1084; &amp;#1091;&amp;#1079;&amp;#1085;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1090;&amp;#1080;&amp;#1087; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1072; service, &amp;#1090;&amp;#1086; &amp;#1084;&amp;#1099; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1084; &amp;#1085;&amp;#1077;&amp;#1095;&amp;#1090;&amp;#1086; &amp;#1074;&amp;#1080;&amp;#1076;&amp;#1072;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// DynamicModule.ns.Wrapped_IAccountService_af75f3474a9d4de2b1fe6aa1d26a8e36&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; service.Withdraw(33); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1090;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1090; &amp;#1091;&amp;#1089;&amp;#1087;&amp;#1077;&amp;#1096;&amp;#1085;&amp;#1086;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; service.Withdraw(-6); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1090;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1086;&amp;#1090;&amp;#1082;&amp;#1072;&amp;#1090;&amp;#1080;&amp;#1090;&amp;#1089;&amp;#1103;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Чтобы все это заработало, осталось настроить Unity контейнер через config файл. Укажем правило разрешения типа (mapping) и тип перехвата InterfaceInterceptor:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;unity&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;http://schemas.microsoft.com/practices/2010/unity&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;sectionExtension&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;sectionExtension&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1047;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1089;&amp;#1077;&amp;#1074;&amp;#1076;&amp;#1086;&amp;#1085;&amp;#1080;&amp;#1084;&amp;#1099; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1080;&amp;#1079;&amp;#1074;&amp;#1077;&amp;#1089;&amp;#1090;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1086;&amp;#1074; &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;IAccountService&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;UnityTest.IAccountService, UnityTest&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;AccountService&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;UnityTest.AccountService, UnityTest&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;container&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Interception&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;IAccountService&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;mapTo&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;AccountService&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;interceptor&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;InterfaceInterceptor&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;policyInjection&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;container&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;unity&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
PS: Пример можно доработать, добавив дополнительные параметры настройки транзакции, например:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionMethod&lt;/span&gt;(&lt;span style=&quot;color: #2b91af;&quot;&gt;TransactionScopeOption&lt;/span&gt;.Suppress)]&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://gandjustas.blogspot.com/2009/01/aop-unity.html&quot;&gt;AOP времени исполнения в Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.palmmedia.de/Blog/2010/9/26/aop-interception-with-unity-2.0&quot;&gt;AOP - Interception with Unity 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mint.litemedia.se/2009/10/30/aop-in-net-with-unity-interception-model&quot;&gt;AOP in .NET with Unity Interception Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.codewrecks.com/blog/index.php/2009/01/31/unity-and-aop-in-enterprise-library/&quot;&gt;Unity and AOP in enterprise library&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2011/04/aop-unity-20.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>11</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-5719656346705046707</guid><pubDate>Fri, 08 Apr 2011 10:38:00 +0000</pubDate><atom:updated>2011-04-08T14:39:54.493+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">EF</category><category domain="http://www.blogger.com/atom/ns#">Hello</category><title>Hello, Entity Framework &quot;Code-First&quot;</title><description>В этой статье рассмотрим простой пример, демонстрирующий новый способ разработки через &quot;Code-first&quot; для Entity Framework 4. В первую очередь, Entity Framework 4 Code-First нацелен на разработчиков, сфокусированных на Domain-driven design (DDD).&lt;br /&gt;
Предположим у нас имеется электронный магазин, в котором ведется два списка: список покупателей (Customers) и список заказов (Orders), которые храняться в базе данных ShopDb. Необходимо реализовать CRUD доступ над указанными сущностями в базе данных, используя весь потенциал Entity Framework 4.&lt;br /&gt;
Итак, в лучших традициях DDD начнем нашу работу с описания предметной области, для этого добавим в наш Solution проект (назовем его Domain), в который добавим два POCO (plain old CLR objects) класса Customer и Order, связанных отношением один-ко-многим:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Customer&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; CustomerId { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; ContactName { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICollection&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Order&lt;/span&gt;&amp;gt; Orders { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Order&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; OrderId { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; Description { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Customer&lt;/span&gt; Customer { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Важно отметить тот факт, что наша модель не реализует сторонних интерфейсов, не наследуется от сторонних классов (например от EntityObject, как это было в предыдущей версии EF) и доступна для редактирования и полностью располагается в отдельной сборке (и мы можем легко экспортировать ее как часть в другой проект) и никаких auto-generated моделей и partial-классов, никаких T4 преобразований. Мы сосредоточились на предметной области и реализовали чистую модель и ничего лишнего.&lt;br /&gt;
Приступим ко второй части статьи: реализации CRUD функционала над предметной областью используя Entity Framework с новой возможностью code-first. Для этого добавим в solution новый проект со сылкой на наш Domain и System.Data.Entity (стандартное пространство имен для EF), в который добавим класс ShopDbContext:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ShopDbContext&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;DbContext&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DbSet&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Customer&lt;/span&gt;&amp;gt; Customers { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DbSet&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Order&lt;/span&gt;&amp;gt; Orders { &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Классы DbContext и DbSet это новые классы, добавленные в Entity Framework Code-first. Если проводить аналогию, то DbContext это аналог ObjectContext, контейнер наших сущностей, а DbSet аналог ObjectSet, черз который мы будем осуществлять все наши запросы. Если заглянуть глубже, то можно увидеть, что DbContext реалиует интерфейс IObjectContextAdapter, который содержит ссылку на уже знакомый нам ObjectContext. &lt;br /&gt;
EF уже содержит в себе все необходимые настройки по-умолчанию, и чтобы начать его использовать вам остается только указать строку соединения к базе данных:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;connectionStrings&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;ShopDbContext&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;connectionString&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Server=Ilya\sqlexpress2005;Database=ShopDb;Trusted_Connection=True;&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;providerName&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;System.Data.SqlClient&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;connectionStrings&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
По-умолчанию, контекст EF выбирает ту строку соединения, имя которой совпадает с названием самого контекста, в нашем случае это ShopDbContext. И если мы запустим приложение, EF по-умолчанию выбирает стандартный маппинг и автоматически создает структуру базы, если такова отсутствует. В нашем случае будет создана новая база ShopDb, содержащая три таблицы: Customers, Orders и служебную EdmMetadata (таблица для идентификации текущего контекста).&lt;br /&gt;
Таблица EdmMetadata содержит хэш код от текущей EF модели, и если мы изменим модель, например добавим поле Address в Customer, то при следующем запуске приложения получим исключение: &lt;br /&gt;
&lt;i&gt;The model backing the &#39;ShopDbContext&#39; context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.&lt;/i&gt;. &lt;br /&gt;
В исключении сказано, что EF-модель была обновлена, и текущая схема базы данных перестала соответствовать предметной области и ее необходимо пересоздать либо обновить. &lt;br /&gt;
По-умолчанию EF не знает, как выполнить подобный upgrade нашей БД, но мы можем ей это указать, передав в процедуру Database.SetInitializer&lt;shopdbcontext&gt;(.) перед стартом приложения свой IDatabaseInitializer, или например воспользоваться уже готовым DropCreateDatabaseIfModelChanges.&lt;br /&gt;
Например, если мы хотим очищать базу каждый раз при обновлении модели:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Database&lt;/span&gt;.SetInitializer&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ShopDbContext&lt;/span&gt;&amp;gt;(&lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DropCreateDatabaseIfModelChanges&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ShopDbContext&lt;/span&gt;&amp;gt;());&lt;/p&gt;&lt;/span&gt;</description><link>http://www.handcode.ru/2011/04/hello-entity-framework-code-first.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1136860839455137729</guid><pubDate>Thu, 10 Mar 2011 13:41:00 +0000</pubDate><atom:updated>2012-03-25T23:27:37.801+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">cache</category><category domain="http://www.blogger.com/atom/ns#">WCF</category><title>Caching в WCF сервисе</title><description>Кэширование данных неотъемлемая часть высоконагруженных и ресурсоемких проектов. В этой статье я опишу процесс организации оптимального механизма кэширования в WCF сервисе. Сформулирую задачу: имея WCF сервис, нужно организовать кеширование результатов работы любого сервис-метода в зависимости от входных параметров (Caching Support for WCF Services). Существует множество решений поставленной задачи, и самое простое и очевидное, это организовать кэширование прямо в сервис-методе:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt; GetDate()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICache&lt;/span&gt; cache = ...; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1084; &amp;#1101;&amp;#1082;&amp;#1079;&amp;#1077;&amp;#1084;&amp;#1087;&amp;#1083;&amp;#1103;&amp;#1088; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; key = &lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;somekey&amp;quot;&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; value;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1091;&amp;#1077;&amp;#1084; &amp;#1076;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1080;&amp;#1079; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (!cache.TryGet(key, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; value))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1074; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1077; &amp;#1086;&amp;#1090;&amp;#1089;&amp;#1091;&amp;#1090;&amp;#1089;&amp;#1090;&amp;#1074;&amp;#1091;&amp;#1102;&amp;#1090;,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1084; &amp;#1085;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1077; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; value = &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080; &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1089;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1080;&amp;#1093; &amp;#1074; &amp;#1082;&amp;#1101;&amp;#1096; &amp;#1085;&amp;#1072; 5 &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cache.Add(key, value, &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt;.FromSeconds(5));&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt;)value;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Из примера видно, что сервис-метод GetDate перегружен логикой кэширования, и с появлением еще одного аналогичного сервис-метода, логика кэширования будет просто скопирована в него. Очевидно, что такой подход приведет к тому, что со временем такой код станет труднее поддерживать при изменении схемы кэширования, и естественно возникает вопрос об организации функционала сквозного кэширования. Организовать такую функциональность можно через &lt;a href=&quot;http://en.wikipedia.org/wiki/Aspect-oriented_programming&quot;&gt;AOP&lt;/a&gt; или в случае с WCF можно воспользоваться стандартным механизмом перехвата вызова через специальные интерфейсы (WCF Interceptor Interfaces), а точнее через интерфейс &lt;a href=&quot;IOperationInvoker&quot;&gt;IOperationInvoker&lt;/a&gt;.&lt;br /&gt;
И, предже чем приступить к реализации наметим основные шаги:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Для начала создадим простой WCF сервис&lt;/li&gt;
&lt;li&gt;Объявим интерфейс кэша ICache&lt;/li&gt;
&lt;li&gt;Реализуем свой перехватчик (IOperationInvoker)&lt;/li&gt;
&lt;li&gt;И закончим реализацией IOperationBehavior атрибута для нашего перехватчика&lt;/li&gt;
&lt;/ol&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Шаг 1.&lt;/b&gt; Создадим новый WCF проект, назовем его MyService, с контрактом в виде интерфейса:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IMyService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt; GetDate();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Сервис метод GetDate() будет возвращать текущее время на сервере (этот метод и будем кэшировать).&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyService&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IMyService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt; GetDate()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Шаг 2.&lt;/b&gt; Наш WCF сервис будет работать с кэшем, но пока у нас нет конкретной реализации кэша, поэтому определим только интерфейс:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICache&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; TryGet(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; key, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; value);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Add(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; key, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; value, &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt; timeout);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;i&gt;Для простоты, в интерфейсе только два метода, для извлечения из кэша (TryGet) и помещение в кэш (Add).&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Шаг 3.&lt;/b&gt; Теперь самое интересное. Когда мы делаем вызов любого сервис-метода из клиентского приложения, мы посылаем WCF сервису сообщение (SOAP), которое содержит: название метода, входные параметры для метода и прочее. Далее WCF сервис, получив запрос от клиента в виде сообщения (SOAP), наравляет его на обработку в свой Dispatcher - некий конвеер по обработке запроса, который можно разбить на два последовательных участка: DispatchRuntime и DispatchOperation. Нас будет интересовать последний, так как именно там (а более точнее в экземпляре объекта типа &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ioperationinvoker.aspx&quot;&gt;IOperationInvoker&lt;/a&gt;) происходит непосредственный вызов сервис метода с передачей ему уже десериализованных входных параметров и получение результатов выполнения, которые мы и собираемся кэшировать. Стандартный IOperationInvoker не умеет кэшировать, поэтому придется написать свой:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;CacheOperationInvoker&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IOperationInvoker&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IOperationInvoker&lt;/span&gt; _invoker;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICache&lt;/span&gt; _cache;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt; _timeout;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; CacheOperationInvoker(&lt;span style=&quot;color: #2b91af;&quot;&gt;IOperationInvoker&lt;/span&gt; invoker, &lt;span style=&quot;color: #2b91af;&quot;&gt;ICache&lt;/span&gt; cache, &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt; timeout)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _invoker = invoker; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1076;&amp;#1072;&amp;#1088;&amp;#1090;&amp;#1085;&amp;#1099;&amp;#1081; OperationInvoker&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _cache = cache;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1085;&amp;#1072;&amp;#1096; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _timeout = timeout; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1072;&amp;#1082; &amp;#1076;&amp;#1086;&amp;#1083;&amp;#1075;&amp;#1086; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090; &amp;#1073;&amp;#1091;&amp;#1076;&amp;#1077;&amp;#1090; &amp;#1085;&amp;#1072;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090;&amp;#1100;&amp;#1089;&amp;#1103; &amp;#1074; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; Invoke(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; instance, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] inputs, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] outputs)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1061;&amp;#1101;&amp;#1096; &amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;. &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1072;&amp;#1079;&amp;#1091;&amp;#1084;&amp;#1085;&amp;#1086; &amp;#1074;&amp;#1099;&amp;#1095;&amp;#1080;&amp;#1089;&amp;#1083;&amp;#1103;&amp;#1090;&amp;#1100; &amp;#1077;&amp;#1075;&amp;#1086; &amp;#1085;&amp;#1072; &amp;#1086;&amp;#1089;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1077; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1074;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1087;&amp;#1072;&amp;#1088;&amp;#1072;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1074; &amp;#1080; &amp;#1085;&amp;#1072;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1082;&amp;#1077;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1091;&amp;#1077;&amp;#1084;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;&amp;#1072;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1086; &amp;#1084;&amp;#1099; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1090;&amp;#1099; &amp;#1086;&amp;#1073;&amp;#1086;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1084;&amp;#1089;&amp;#1103; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1090;&amp;#1086;&amp;#1081;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; key = &lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;somekey&amp;quot;&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[]&amp;gt; result;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; cacheItem;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1091;&amp;#1077;&amp;#1084; &amp;#1076;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1080;&amp;#1079; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (!_cache.TryGet(key, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; cacheItem))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1074; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1077; &amp;#1086;&amp;#1090;&amp;#1089;&amp;#1091;&amp;#1090;&amp;#1089;&amp;#1090;&amp;#1074;&amp;#1091;&amp;#1102;&amp;#1090;,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1084; &amp;#1085;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1077; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077;, &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1077;&amp;#1084; &amp;#1073;&amp;#1072;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1081; Invoke&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; returnValue = _invoker.Invoke(instance, inputs, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; outputs);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1076;&amp;#1075;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1074;&amp;#1080;&amp;#1084; &amp;#1085;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1081; &amp;#1101;&amp;#1083;&amp;#1077;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1090; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1072; (&amp;#1091;&amp;#1087;&amp;#1072;&amp;#1082;&amp;#1091;&amp;#1077;&amp;#1084; returnValue &amp;#1080; outputs)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = &lt;span style=&quot;color: #2b91af;&quot;&gt;Tuple&lt;/span&gt;.Create&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[]&amp;gt;(returnValue, outputs);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1099;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1085;&amp;#1080;&amp;#1084; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1085;&amp;#1072; &amp;#1091;&amp;#1082;&amp;#1072;&amp;#1079;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1081; timeout&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _cache.Add(key, result, _timeout);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;else&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1085;&amp;#1072;&amp;#1096;&amp;#1083;&amp;#1080;&amp;#1089;&amp;#1100; &amp;#1074; &amp;#1082;&amp;#1101;&amp;#1096;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = cacheItem &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[]&amp;gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputs = result.Item2;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; result.Item1;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] AllocateInputs()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1089;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _invoker.AllocateInputs();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IAsyncResult&lt;/span&gt; InvokeBegin(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; instance, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] inputs, &lt;span style=&quot;color: #2b91af;&quot;&gt;AsyncCallback&lt;/span&gt; callback, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; state)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1089;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _invoker.InvokeBegin(instance, inputs, callback, state);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; InvokeEnd(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; instance, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt;[] outputs, &lt;span style=&quot;color: #2b91af;&quot;&gt;IAsyncResult&lt;/span&gt; result)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1089;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _invoker.InvokeEnd(instance, &lt;span style=&quot;color: blue;&quot;&gt;out&lt;/span&gt; outputs, result);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; IsSynchronous&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1089;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _invoker.IsSynchronous; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Шаг 4.&lt;/b&gt; Вся основная работа уже сделана, осталось как то наделить наш севис метод данным поведением. Для этого надо реализовать атрибут, который к тому же еще и IOperationBehavior:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;CacheBehaviorAttribute&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Attribute&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;IOperationBehavior&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt; _timeout;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; CacheBehaviorAttribute(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; seconds)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _timeout = &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt;.FromSeconds(seconds);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationDescription&lt;/span&gt; operationDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;DispatchOperation&lt;/span&gt; dispatchOperation)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1076;&amp;#1072;&amp;#1088;&amp;#1090;&amp;#1085;&amp;#1099;&amp;#1081; OperationInvoker&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IOperationInvoker&lt;/span&gt; invoker = dispatchOperation.Invoker;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1072;&amp;#1096; &amp;#1082;&amp;#1101;&amp;#1096;, &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1091;&amp;#1084;&amp;#1085;&amp;#1086; &amp;#1089;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1077;&amp;#1075;&amp;#1086; singleton &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1080;&amp;#1079; DI/IoC-&amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;ICache&lt;/span&gt; cache = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyCache&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1076;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1084; &amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1076;&amp;#1072;&amp;#1088;&amp;#1090;&amp;#1085;&amp;#1099;&amp;#1081; OperationInvoker &amp;#1088;&amp;#1072;&amp;#1089;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1084;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dispatchOperation.Invoker = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;CacheOperationInvoker&lt;/span&gt;(invoker, cache, _timeout);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Validate(&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationDescription&lt;/span&gt; operationDescription)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationDescription&lt;/span&gt; operationDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;BindingParameterCollection&lt;/span&gt; bindingParameters)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationDescription&lt;/span&gt; operationDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;ClientOperation&lt;/span&gt; clientOperation)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
и не забываем пометить этим атрибутом севис-метод в сервис-интерфейсе:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IMyService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af;&quot;&gt;CacheBehavior&lt;/span&gt;(5)] &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1050;&amp;#1101;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1091;&amp;#1077;&amp;#1084; &amp;#1088;&amp;#1077;&amp;#1079;&amp;#1091;&amp;#1083;&amp;#1100;&amp;#1090;&amp;#1072;&amp;#1090; &amp;#1085;&amp;#1072; 5 &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt; GetDate();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
PS: Если Вы реализуете кэширование для WCF Web HTTP Services, то нужно использовать стандартный &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee230443.aspx&quot;&gt;механизм кэширования&lt;/a&gt; ASP.net. Пример, приведенный в статье, демонстрирует общий подход к решению проблемы.&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc163302.aspx&quot;&gt;Extending WCF with Custom Behaviors&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2011/03/caching-wcf.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-7540106123574603558</guid><pubDate>Thu, 20 Jan 2011 09:08:00 +0000</pubDate><atom:updated>2011-01-20T12:08:34.071+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">IoC/DI</category><category domain="http://www.blogger.com/atom/ns#">WCF</category><title>IoC/DI в WCF на примере Unity 2.0</title><description>В этой статье я продемонстрирую процесс внедрения IoC/DI контейнера (на примере Unity 2.0) в WCF сервис. В примере я выбрал Unity 2.0, но на самом деле это не существенно, и по желанию можно легко адаптировать код под другой IoC/DI контейнер. Для тех кто не знаком еще с данным контейнером, рекомендую глянуть вводную &lt;a href=&quot;http://www.handcode.ru/2010/04/hello-unity-20.html&quot;&gt;статью&lt;/a&gt;. Существуют несколько путей внедрения IoC/DI контейнера в WCF сервис, рассмотрим один из них*.&lt;br /&gt;
Итак, предже чем приступить к реализации наметим основные шаги:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Для начала создадим простой WCF сервис&lt;/li&gt;
&lt;li&gt;Реализуем свой IInstanceProvider&lt;/li&gt;
&lt;li&gt;Далее опишем собственную реализацию IServiceBehavior&lt;/li&gt;
&lt;li&gt;Определим BehaviorExtensionElement&lt;/li&gt;
&lt;li&gt;И закончим, добавив необходимые настройки в web.config&lt;/li&gt;
&lt;/ol&gt;&lt;i&gt;*На самом деле это не единственный способ внедрения контейнера, существуют варианты с использованием ServiceHostBase и ServiceHostFactoryBase&lt;/i&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Шаг 1.&lt;/b&gt;Создадим новый WCF проект, назовем его WcfService, с контрактом в виде интерфейса:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IHelloService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af;&quot;&gt;OperationContract&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; Say(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; name);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Реализуем данный интерфейс в виде класса, с осуществлением инъекции (injection) в виде типа IEnveloper в конструктор:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;HelloService&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IHelloService&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IEnveloper&lt;/span&gt; _enveloper;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048;&amp;#1085;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1072; IEnveloper &amp;#1074; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1091;&amp;#1082;&amp;#1090;&amp;#1086;&amp;#1088;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; HelloService(&lt;span style=&quot;color: #2b91af;&quot;&gt;IEnveloper&lt;/span&gt; enveloper)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _enveloper = enveloper;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; Say(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; name)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; data = &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;.Format(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Hello, {0}&amp;quot;&lt;/span&gt;, name);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _enveloper.Envelop(data);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Шаг 2.&lt;/b&gt;За создание экземпляра IHelloService отвечает IInstanceProvider, но стандартный IInstanceProvider не умеет делать инъекции, поэтому необходимо реализовать свой, для этого добавляем следующий класс:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityInstanceProvider&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IInstanceProvider&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; _container;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; _serviceType;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; UnityInstanceProvider(&lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; container, &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; serviceType)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _serviceType = serviceType;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _container = container;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; GetInstance(&lt;span style=&quot;color: #2b91af;&quot;&gt;InstanceContext&lt;/span&gt; instanceContext, &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; message)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1071; &amp;#1085;&amp;#1077; &amp;#1080;&amp;#1089;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1079;&amp;#1091;&amp;#1102; &amp;#1079;&amp;#1076;&amp;#1077;&amp;#1089;&amp;#1100; &amp;#1080;&amp;#1085;&amp;#1092;&amp;#1086;&amp;#1088;&amp;#1084;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1102; message, &amp;#1093;&amp;#1086;&amp;#1090;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1086;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1088;&amp;#1077;&amp;#1096;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1099; &amp;#1085;&amp;#1072; &amp;#1086;&amp;#1089;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1077;&amp;#1081; (&amp;#1080;&amp;#1083;&amp;#1080; &amp;#1079;&amp;#1072;&amp;#1075;&amp;#1086;&amp;#1083;&amp;#1086;&amp;#1074;&amp;#1082;&amp;#1086;&amp;#1074;) &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1089;&amp;#1086;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1072;&amp;#1097;&amp;#1080;&amp;#1077;&amp;#1089;&amp;#1103; &amp;#1074; message.&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; GetInstance(instanceContext);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; GetInstance(&lt;span style=&quot;color: #2b91af;&quot;&gt;InstanceContext&lt;/span&gt; instanceContext)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1076;&amp;#1077;&amp;#1089;&amp;#1100; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090; &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1088;&amp;#1077;&amp;#1096;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1072;, &amp;#1089;&amp;#1086; &amp;#1074;&amp;#1089;&amp;#1077;&amp;#1084;&amp;#1080; &amp;#1080;&amp;#1085;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1103;&amp;#1084;&amp;#1080;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; _container.Resolve(_serviceType);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ReleaseInstance(&lt;span style=&quot;color: #2b91af;&quot;&gt;InstanceContext&lt;/span&gt; instanceContext, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; instance)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1058;&amp;#1072;&amp;#1082; &amp;#1082;&amp;#1072;&amp;#1082; &amp;#1090;&amp;#1080;&amp;#1087; &amp;#1087;&amp;#1086;&amp;#1088;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1083; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088;, &amp;#1086;&amp;#1085; &amp;#1078;&amp;#1077; &amp;#1077;&amp;#1075;&amp;#1086; &amp;#1080; &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1088;&amp;#1091;&amp;#1096;&amp;#1072;&amp;#1077;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _container.Teardown(instance);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Шаг 3.&lt;/b&gt;UnityInstanceProvider готов, но стандартное поведение(behavior) использует страндартный InstanceProvider, и для того чтобы сообщить среде, что надо использовать наш UnityInstanceProvider нужно реализовать свое поведение (behavior):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityServiceBehavior&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IServiceBehavior&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; _container;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; UnityServiceBehavior(&lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; container)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _container = container;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceDescription&lt;/span&gt; serviceDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceHostBase&lt;/span&gt; serviceHostBase, &lt;span style=&quot;color: #2b91af;&quot;&gt;Collection&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceEndpoint&lt;/span&gt;&amp;gt; endpoints, &lt;span style=&quot;color: #2b91af;&quot;&gt;BindingParameterCollection&lt;/span&gt; bindingParameters)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceDescription&lt;/span&gt; serviceDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceHostBase&lt;/span&gt; serviceHostBase)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; cdb &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; serviceHostBase.ChannelDispatchers)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;ChannelDispatcher&lt;/span&gt; cd = cdb &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ChannelDispatcher&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (cd != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; ed &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; cd.Endpoints)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1058;&amp;#1080;&amp;#1087; &amp;#1085;&amp;#1072;&amp;#1096;&amp;#1077;&amp;#1075;&amp;#1086; &amp;#1089;&amp;#1077;&amp;#1088;&amp;#1074;&amp;#1080;&amp;#1089;&amp;#1072;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; serviceType = serviceDescription.ServiceType;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1076;&amp;#1075;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1074;&amp;#1080;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1088;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1061;&amp;#1086;&amp;#1090;&amp;#1103; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1088; &amp;#1089;&amp;#1072;&amp;#1084; &amp;#1073;&amp;#1099; &amp;#1084;&amp;#1086;&amp;#1075; &amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1090;&amp;#1100; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088; &amp;#1074; &amp;#1089;&amp;#1077;&amp;#1073;&amp;#1077;, &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1085;&amp;#1086; &amp;#1083;&amp;#1091;&amp;#1095;&amp;#1096;&amp;#1077; &amp;#1080;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1100; &amp;#1086;&amp;#1076;&amp;#1080;&amp;#1085; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1081;&amp;#1085;&amp;#1077;&amp;#1088; &amp;#1085;&amp;#1072; &amp;#1074;&amp;#1089;&amp;#1077;&amp;#1093;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IInstanceProvider&lt;/span&gt; provider = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityInstanceProvider&lt;/span&gt;(_container, serviceType);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1082;&amp;#1072;&amp;#1078;&amp;#1077;&amp;#1084; &amp;#1089;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077; &amp;#1080;&amp;#1089;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1085;&amp;#1072;&amp;#1096; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1088;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ed.DispatchRuntime.InstanceProvider = provider;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Validate(&lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceDescription&lt;/span&gt; serviceDescription, &lt;span style=&quot;color: #2b91af;&quot;&gt;ServiceHostBase&lt;/span&gt; serviceHostBase)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Шаг 4.&lt;/b&gt;Осталось наделить наш новый WCF сервис нашим новым поведением UnityServiceBehavior. Это можно сделать как и в коде, так и через web.config (что удобнее). Так как UnityServiceBehavior является по сути расширением, и чтобы опледелить его в настройках (web.config) необходимо определить для него элемент конфигурации:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityServiceBehaviorExtensionElement&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;BehaviorExtensionElement&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Type&lt;/span&gt; BehaviorType&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: #2b91af;&quot;&gt;UnityServiceBehavior&lt;/span&gt;); }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; CreateBehavior()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IUnityContainer&lt;/span&gt; container = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityContainer&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1072;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1072;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1077;&amp;#1095;&amp;#1085;&amp;#1086; &amp;#1083;&amp;#1091;&amp;#1095;&amp;#1096;&amp;#1077; &amp;#1074; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1092;&amp;#1080;&amp;#1075;&amp;#1091;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1086;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1084;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1092;&amp;#1072;&amp;#1081;&amp;#1083;&amp;#1077;, &amp;#1085;&amp;#1086; &amp;#1090;&amp;#1072;&amp;#1082; &amp;#1073;&amp;#1091;&amp;#1076;&amp;#1077;&amp;#1090; &amp;#1073;&amp;#1099;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1077;&amp;#1077; &amp;#1080; &amp;#1085;&amp;#1072;&amp;#1076;&amp;#1077;&amp;#1078;&amp;#1085;&amp;#1077;&amp;#1077;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; container.RegisterType&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;IEnveloper&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;XmlEnveloper&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;UnityServiceBehavior&lt;/span&gt;(container);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
где XmlEnveloper одна из возможных реализаций IEnveloper:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;XmlEnveloper&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IEnveloper&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; Envelop(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; data)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;.Format(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&amp;lt;result&amp;gt;{0}&amp;lt;/result&amp;gt;&amp;quot;&lt;/span&gt;, data);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Шаг 4.&lt;/b&gt;Наделяем наш WCF сервис новым поведением, делается это просто в web.config.&lt;br /&gt;
Регистрируем расширение в секции extensions:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;extensions&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behaviorExtensions&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;serviceInjection&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;WcfService.UnityServiceBehaviorExtensionElement, WcfService&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behaviorExtensions&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;extensions&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Добавляем поведение serviceInjection в секцию behavior:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behaviors&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;serviceBehaviors&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behavior&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;serviceInjection&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behavior&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;serviceBehaviors&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;behaviors&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
Сервис готов!</description><link>http://www.handcode.ru/2011/01/iocdi-wcf-unity-20.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1861495242335478988</guid><pubDate>Thu, 30 Dec 2010 17:26:00 +0000</pubDate><atom:updated>2010-12-31T11:53:18.772+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">math</category><title>Строим идентификатор для множества</title><description>Вчера вспомнил про одну интересную задачу, в которой необходимо было построить ключ для множества. Задача заключалась в построении &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BC%D1%83%D1%82%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F&quot;&gt;коммутативного оператора&lt;/a&gt; над множеством, причем результат операции должен быть уникален для каждого множества.&lt;br /&gt;
&lt;p&gt;Сформулируем требование следующим образом: найти такой оператор &lt;b&gt;F&lt;/b&gt;, что для любого набора &lt;b&gt;(u, v, ...)&lt;/b&gt; будет выполнено:&lt;br /&gt;
&lt;b&gt;F(u, v, ...)= F(v, u, ...)=F(&lt;i&gt;всевозможные перестановки&lt;/i&gt;)&lt;/b&gt; &lt;i&gt;(условие коммутативности)&lt;/i&gt;, причем не существует любого другого элемента &lt;b&gt;z != u&lt;/b&gt;, такого что выполняется: &lt;br /&gt;
&lt;b&gt;F(u, v, ...)=F(z, v, ...)=F(&lt;i&gt;всевозможные перестановки&lt;/i&gt;)&lt;/b&gt; &lt;i&gt;(условие уникальности)*&lt;/i&gt;.&lt;br /&gt;
Или более привычно: &lt;b&gt;u, v, ...&lt;/b&gt; являются простыми ключами, а &lt;b&gt;F(u, v, ...)&lt;/b&gt; составным ключом в единственном числе. &lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;br /&gt;
&lt;p&gt;Где это может пригодиться? При работе со словарями (Dictionary). Например, Вам необходимо поместить объект Obj в Dictionary, для этого нужно построить ключ key, но как же быть, если Obj идентифицируется множеством &lt;b&gt;(u, v, ...)&lt;/b&gt;, а как известно, элементы множества не упорядочены и мы не можем просто построить цепочку идентификаторов &lt;b&gt;(key1, key2, ...)&lt;/b&gt; (по аналогии со вложенными Dictionary). Ключ в данной задаче находится как применение оператора &lt;b&gt;F&lt;/b&gt; на искомое множество: &lt;b&gt;key=F(u, v, ...)&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Без ограничения общности можно принять, что набор есть множество строк и ограничиться набором из 2-х элементов. &lt;/p&gt;&lt;p&gt;Как оказалось, решение очень простое, для того чтобы построить уникальный ключ для множества из двух строк &lt;b&gt;u&lt;/b&gt; и &lt;b&gt;v&lt;/b&gt;, нужно посимвольно сравнить &lt;b&gt;u&lt;/b&gt; и &lt;b&gt;v&lt;/b&gt;, выбрав &lt;b&gt;max = max(u, v), min = min(u, v)&lt;/b&gt; (в данном случае необходимо найти только либо max либо min), а далее выполнить простую конкатенацию (concat) полученых значений через разделитель (delimiter): &lt;br /&gt;
&lt;b&gt;F(u, v) = max(u, v) + delimiter + min(u, v).&lt;/b&gt; &lt;br /&gt;
По аналогии задачу можно продолжить на n-мерный случай.&lt;/p&gt;&lt;br /&gt;
&lt;b&gt;UPD*:&lt;/b&gt; Стоит заметить, что если вместо Dictionary использовать Hashtable, то условие уникальности ключа не обязательно &lt;i&gt;(см. комментарии)&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Всем спасибо!&lt;br /&gt;
И Всех с наступающим Новым Годом!</description><link>http://www.handcode.ru/2010/12/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-6049890512849333849</guid><pubDate>Wed, 22 Dec 2010 12:18:00 +0000</pubDate><atom:updated>2010-12-22T15:18:59.671+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Hello</category><category domain="http://www.blogger.com/atom/ns#">T4</category><title>Используем Reflection в T4  (Text Template Transformation Toolkit)</title><description>Недавно, мне была поставлена следующая задача: для каждого класса из стороннего API, разработать обертку (&lt;a href=&quot;http://stackoverflow.com/questions/889160/what-is-a-wrapper-class&quot;&gt;wrapper class&lt;/a&gt;), для удобства использования стороннего API. Оптимальное решение подобных задач всегда использовать кодогенерацию, а наиболее удобный инструмент для этого, это &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb126445.aspx&quot;&gt;T4&lt;/a&gt; (Text Template Transformation Toolkit). Так как набор классов находился в уже скомпилированной сборке, то действовать надо было только через System.Reflection. Как выяснилось позже, что при работе со сборкой через reflection в T4 возникает проблема блокировки, загружаемой через Assembly.Load, сборки. Stackoverflow подсказал, что для решения данной проблемы нужно воспользоваться &lt;a href=&quot;http://code.msdn.microsoft.com/codeanalysis&quot;&gt;FxCop API&lt;/a&gt;, предоставляющий достаточный инструментарий для работы со сборкой на уровне Reflection. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
На момент написания статьи была доступна версия 1.35, релиз которой доступен &lt;a href=&quot;http://code.msdn.microsoft.com/codeanalysis/Release/ProjectReleases.aspx&quot;&gt;здесь&lt;/a&gt;. Не буду вдаваться в подробности моей задачи, а просто приведу простой Hello-world пример работы с FxCop библиотекой. Итак  после установки FxCop, добавим в наш проект новый T4 файл (TestTemplate.tt) содержащий следующий код:&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#@&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #A52A2A;&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;hostSpecific&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#@&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #A52A2A;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;.T4.txt&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#@&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #A52A2A;&quot;&gt;assembly&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;C:\Program Files\Microsoft FxCop 1.35\FxCopSdk.dll&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#@&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #A52A2A;&quot;&gt;assembly&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;C:\Program Files\Microsoft FxCop 1.35\Microsoft.Cci.dll&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#@&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #A52A2A;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;Microsoft.Cci&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; assemblyPath = &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;@&quot;...путь к нашей сборке...&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Загрузка сборки без блокировки (аналог Assembly)&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
AssemblyNode assembly = AssemblyNode.GetAssembly(assemblyPath);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Указываем какое пространство имен&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
Identifier namespaceId = Identifier.For(&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;SomeNamespace&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Указываем какой тип (у нас это имя класса)&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
Identifier typeId = Identifier.For(&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;SomeType&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Получаем полную информацию о типе (аналог System.Type) &lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
TypeNode type = assembly.GetType(namespaceId, typeId);&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Перечислим все члены типа (свойства, методы, события)&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Member member &lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; type.Members)&lt;br /&gt;
{&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Публичный ли член&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(member.IsPublic)&lt;br /&gt;
{&lt;br /&gt;
WriteMember(member);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;&amp;lt;#+&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; WriteMember(Member member)&lt;br /&gt;
{&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Если член является свойством&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(member &lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Property)&lt;br /&gt;
WriteProperty(member &lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Property);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; WriteProperty(Property property)&lt;br /&gt;
{&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Получим имя свойства (полное имя, имя)&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
Identifier name = property.Name;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Получим CLR тип свойства System.Type.&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
System.Type type = property.Type.GetRuntimeType();&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Форматируемый вывод.&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; color: #000000;&quot;&gt;&lt;br /&gt;
WriteLine(&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;Property &#39;{0}&#39; type of &#39;{1}&#39;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, name, type);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;background-color: #FFD700; color: #000000;&quot;&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Выполнив &quot;Run Custom Tool&quot; на шаблоне T4 мы получим текстовый файл (TestTemplate.T4.txt), в котором перечилены все публичные свойства указанного типа, с указанием имени свойства и его CLR типа:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;Property &#39;SomeProperty&#39; type of &#39;System.Int32&#39;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Так как сейчас я не генерировал код, я просто вывел результат в обычный текстовый файл.&lt;br /&gt;
Оригинальный тип:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;namespace&lt;/span&gt; SomeNamespace&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;SomeType&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; SomeProperty&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;; &lt;span style=&quot;color: blue;&quot;&gt;get&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; SomeMethod()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Дальше можно усложнить нашу разметку. Например, разметка в виде C# кода, для получения исходника, или разметка в виде XML, CSV и другие. &lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.olegsych.com/2008/05/t4-architecture/&quot;&gt;T4 architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/2601373/what-are-the-ramifications-of-using-system-reflection-assembly-loadsystem-io-fil&quot;&gt;What are the ramifications of using System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path)) in T4?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1031431/system-reflection-assembly-loadfile-locks-file&quot;&gt;System.Reflection.Assembly.LoadFile Locks File&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2010/12/reflection-t4-text-template.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-2988726553509217536</guid><pubDate>Wed, 17 Nov 2010 09:53:00 +0000</pubDate><atom:updated>2010-12-02T11:34:36.358+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">cache</category><category domain="http://www.blogger.com/atom/ns#">performance</category><title>False sharing</title><description>Казалось бы, зачем задумывываться о процессах, происходящих на таком низком уровне, как кэширование данных в L1 и L2 кешах (L1, L2 cache), если Вы программируете под .NET. Очевидно для повышения быстродействия программы (perfomance) за счет уменьшения кэш-промахов (Cache Miss). Самый простой и классический пример демонстрирующий проблему Cache Miss, это  &quot;неправильный&quot; обход массива. При &quot;правильном&quot; обходе количество промахов будет минимально, следовательно участок кода выполнится быстрее:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; size = 10000;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;[,] matrix = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;[size, size];&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1100; &amp;#1084;&amp;#1077;&amp;#1076;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; col = 0; col &amp;lt; size; col++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; row = 0; row &amp;lt; size; row++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; matrix[row, col] = 0;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1041;&amp;#1099;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; row = 0; row &amp;lt; size; row++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; col = 0; col &amp;lt; size; col++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; matrix[row, col] = 0;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Еще один пример (с wikipedia), допустим нам необходимо как-то вычислять поле Foo.x, в нашем случае это простая инкрементация:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1100; &amp;#1084;&amp;#1077;&amp;#1076;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1081;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt; foo = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo.x++;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
против&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057; &amp;#1083;&amp;#1086;&amp;#1082;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1086;&amp;#1081; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1081;, &amp;#1073;&amp;#1099;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1099;&amp;#1081;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt; foo = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; sum = 0;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum = sum + 1;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; x = 0;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
На моей машине, в примере с матрицей и вычислением поля вторые варианты выполнялись более чем в два раза быстрее первых.&lt;br /&gt;
При многопоточном программировании задача выявления подобных мест намного усложняется. Приведу в качестве примера код, идентичный с точки зрения выполняемой задачи:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1086;&amp;#1079;&amp;#1076;&amp;#1072;&amp;#1076;&amp;#1080;&amp;#1084; &amp;#1101;&amp;#1082;&amp;#1079;&amp;#1077;&amp;#1084;&amp;#1087;&amp;#1083;&amp;#1103;&amp;#1088;&amp;#1099; Some &amp;#1074; &amp;#1075;&amp;#1083;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1086;&amp;#1084; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some1 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some2 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some3 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1090;&amp;#1080;&amp;#1084; 3 &amp;#1087;&amp;#1072;&amp;#1088;&amp;#1072;&amp;#1083;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Parallel&lt;/span&gt;.Invoke&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;(&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some1.Do(); } },&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some2.Do(); } },&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some3.Do(); } }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;);&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
против &lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; 2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1090;&amp;#1080;&amp;#1084; 3 &amp;#1087;&amp;#1072;&amp;#1088;&amp;#1072;&amp;#1083;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1093; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048;&amp;#1085;&amp;#1080;&amp;#1094;&amp;#1080;&amp;#1072;&amp;#1083;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; Some &amp;#1073;&amp;#1091;&amp;#1076;&amp;#1077;&amp;#1090; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090;&amp;#1100; &amp;#1074;&amp;#1085;&amp;#1091;&amp;#1090;&amp;#1088;&amp;#1080; &amp;#1082;&amp;#1072;&amp;#1078;&amp;#1076;&amp;#1086;&amp;#1081; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1080;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Parallel&lt;/span&gt;.Invoke&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;(&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some1 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;(); &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some1.Do(); } },&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some2 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;(); &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some2.Do(); } },&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; () =&amp;gt; { &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some3 = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;(); &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; MaxIter; i++) { some3.Do(); } }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;);&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Q:&lt;/b&gt;&lt;i&gt;Какой из этих двух вариантов выполнится быстрее?&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Все зависит от реализации метода Some.Do. Если метод Do изменяет состояние объекта Some таким образом, что строка (cache line) загруженная в кэш станет недействительной, то почти наверняка, второй вариант будет выполнятся намного быстрее первого (ситуация False Sharing), иначе оба варианта потребуют примерно одинаковое время на выполнение.&lt;br /&gt;
Например, подобная реализация Some увеличит время исполнения первого варианта относительно второго:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1077;&amp;#1072;&amp;#1083;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; Some &amp;#1089; &amp;#1080;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084;&amp;#1099;&amp;#1084; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077;&amp;#1084;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; _x = 0; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1072; Some&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Do()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1103;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _x++;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Но стоит увеличить объект таким образом, что кэшируемые данные окажутся в разных кэш-строках, то скорость выполнения первого и врогого варианта сравняется:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1077;&amp;#1072;&amp;#1083;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; Some &amp;#1089; &amp;#1080;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084;&amp;#1099;&amp;#1084; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077;&amp;#1084;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; _x = 0; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1072; Some&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1073;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1096;&amp;#1077; &amp;#1095;&amp;#1077;&amp;#1084; &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1088; &amp;#1082;&amp;#1101;&amp;#1096;-&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1082;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l1;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l2;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l3;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l4;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l5;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l6;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l7;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l8;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l9;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l10;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l11;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l12;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l13;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l14;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l15;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt; l16;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Do()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1103;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _x++;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/False_sharing&quot;&gt;False sharing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc872851.aspx&quot;&gt;MSDN: False sharing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/downloads/en/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&amp;displaylang=en&quot;&gt;Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4&lt;/a&gt;&lt;br /&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2010/11/false-sharing.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1856673444955243047</guid><pubDate>Fri, 29 Oct 2010 15:10:00 +0000</pubDate><atom:updated>2010-10-29T15:46:57.856+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">Config</category><category domain="http://www.blogger.com/atom/ns#">Log</category><title>Настройка логов на примере NLog</title><description>Хочу поделиться с Вами своим best practices по настройке логирования на примере NLog. Логи, это первая вещь, которую приходится настраивать при создании нового проекта, причем обычно для каждого нового проекта настройки логирования выглядят, как шаблонное решение, поэтому разумно выделить единый общий шаблон и использовать его в своих проектах. В данной статье рассмотрим мое простое шаблонное решение, которое я успешно применяю во многих своих проектах. Основная идея которую я отразил в шаблоне, это ведение не одного общего лога, а нескольких, каждый из которых лишь отличается уровнем подробности логирования и назначением, это 2 основных и 2 вспомогательных лога.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Основные&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;ShortLog&lt;/b&gt; - служит для общей оценки работы приложения и выполнят роль &quot;оглавления&quot; для FullLog. Из-за сравнительно небольших размеров его удобно анализировать.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Лог пишется в файл на диск.&lt;/li&gt;
&lt;li&gt;Уровень логирования задан как Info.&lt;/li&gt;
&lt;li&gt;Для уровня Error, Fatal записывается только комментарий ошибки.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FullLog&lt;/b&gt; - служит для детального анализа работы приложения и включает в себя ShortLog. Анализируется выборочно.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Лог пишется в файл на диск.&lt;/li&gt;
&lt;li&gt;Уровень логирования задан как Debug либо Trace.&lt;/li&gt;
&lt;li&gt;Для уровня Error, Fatal записывается комментарий ошибки и информация об исключении.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Вспомогательные&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;ConsoleLog&lt;/b&gt; - аналогичен ShortLog и служит для мониторинга работы программы.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Лог пишется в консоль.&lt;/li&gt;
&lt;li&gt;Уровень логирования задан как Info.&lt;/li&gt;
&lt;li&gt;Для уровня Error, Fatal записывается только комментарий ошибки.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SystemLog&lt;/b&gt; - аналогичен FullLog, но менее подробен и служит для ведения лога основе EventLog.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Лог пишется в EventLog.&lt;/li&gt;
&lt;li&gt;Уровень логирования задан как Info.&lt;/li&gt;
&lt;li&gt;Для уровня Error, Fatal записывается комментарий ошибки и информация об исключении.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;Что касается самих логов, то у меня существуют несколько правил:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Метку времени в persist-логах предпочитаю полную в формате &lt;i&gt;dd.MM.yyyy HH:mm:ss&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Уровень логирования в логах записываю заглавными сразу же после метрки времени и в скобках: &lt;i&gt;29.10.2010 12:39:40 (INFO)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Все логи ведутся в единой директории log&lt;/li&gt;
&lt;li&gt;Лог файлы создаются на текущую дату и располагаются в директории созданной на основе текущей даты в формате &lt;i&gt;yyyy-MM-dd&lt;/i&gt;, для удобства сортировки&lt;/li&gt;
&lt;/ol&gt;Приведу пример конфигурационного файла (NLog.config) для NLog:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;nlog&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;http://www.nlog-project.org/schemas/NLog.xsd&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xmlns:xsi&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1055;&amp;#1091;&amp;#1090;&amp;#1100; &amp;#1082; log &amp;#1076;&amp;#1080;&amp;#1088;&amp;#1077;&amp;#1082;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1080;&amp;#1080; &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;variable&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;logDir&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;./log/${date:format=yyyy-MM-dd}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1053;&amp;#1072;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1081;&amp;#1082;&amp;#1072; Layout &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;variable&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;shortLayout&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${date:format=HH\:mm\:ss} (${level:uppercase=true}): ${message}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;variable&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;commonLayout&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${date:format=dd.MM.yyyy HH\:mm\:ss} (${level:uppercase=true}): ${message}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;variable&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;detailedLayout&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${date:format=dd.MM.yyyy HH\:mm\:ss} (${level:uppercase=true}): ${message}. ${exception:format=ToString}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;targets&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;target&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;consoleLog&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xsi:type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Console&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${shortLayout}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;target&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;shortLog&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xsi:type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;File&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;fileName&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${logDir}/short.log&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${commonLayout}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;target&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;fullLog&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xsi:type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;File&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;fileName&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${logDir}/full.log&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${detailedLayout}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;target&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;systemLog&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;xsi:type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;EventLog&lt;/span&gt;&amp;quot;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;${detailedLayout}&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;targets&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;rules&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1054;&amp;#1089;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1085;&amp;#1099;&amp;#1077; log &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;*&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;minlevel&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Trace&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;writeTo&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;fullLog&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;*&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;minlevel&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Info&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;writeTo&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;shortLog&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1042;&amp;#1089;&amp;#1087;&amp;#1086;&amp;#1084;&amp;#1086;&amp;#1075;&amp;#1072;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1077; log &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;*&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;minlevel&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Info&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;writeTo&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;consoleLog&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;*&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;minlevel&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Info&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;writeTo&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;systemLog&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;rules&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;nlog&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;</description><link>http://www.handcode.ru/2010/10/nlog.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-8108519082035695632</guid><pubDate>Wed, 06 Oct 2010 19:25:00 +0000</pubDate><atom:updated>2010-10-06T19:24:32.020+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Diagnostic</category><category domain="http://www.blogger.com/atom/ns#">Log</category><title>Пишем обертку для Stopwatch</title><description>Во время работы приложения, в качестве мониторинга времени выполнения метода или доступа к свойству используется класс Stopwatch из System.Diagnostics. Работает Stopwatch очень просто, он замеряет время прошедшее между вызовами Start* и Stop* методами. Приведу простой пример:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1072;&amp;#1096; &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1088;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Stopwatch&lt;/span&gt; timer = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Stopwatch&lt;/span&gt;();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;timer.Start(); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1088;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Thread&lt;/span&gt;.Sleep(1234); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1076;&amp;#1086;&amp;#1083;&amp;#1075;&amp;#1072;&amp;#1103; &amp;#1086;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;finally&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; timer.Stop(); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1080;&amp;#1084; &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1088;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1082;&amp;#1072;&amp;#1079;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1089;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1085;&amp;#1076;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1088;&amp;#1072;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt; elapsed = timer.Elapsed;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&amp;#1042;&amp;#1088;&amp;#1077;&amp;#1084;&amp;#1103; &amp;#1074;&amp;#1099;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; {0}&amp;quot;&lt;/span&gt;, elapsed);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
В данном примере видны все неудобства использования Stopwatch, это необходимость явно создавать объект Stopwatch, это явный запуск и остановка секундомера, при этом, если возможны исключения, то нужно добавить и обработку исключений.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Решение данной проблемы очевидное, нужно применить интерфейс IDisposable в сочетании с блоком using. Для этого реализуем вспомогательный класс:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt;&amp;gt; _action;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Stopwatch&lt;/span&gt; _timer;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1079;&amp;#1072;&amp;#1082;&amp;#1088;&amp;#1099;&amp;#1090;&amp;#1099;&amp;#1081; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1089;&amp;#1090;&amp;#1088;&amp;#1091;&amp;#1082;&amp;#1090;&amp;#1086;&amp;#1088;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Watcher(&lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt;&amp;gt; action)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _timer = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Stopwatch&lt;/span&gt;();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _action = action;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _timer.Start();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Dispose()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _timer.Stop();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (_action != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _action(_timer.Elapsed);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;catch&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1085;&amp;#1077; &amp;#1079;&amp;#1072;&amp;#1073;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084;, &amp;#1095;&amp;#1090;&amp;#1086; Dispose&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1073;&amp;#1077;&amp;#1079;&amp;#1086;&amp;#1087;&amp;#1072;&amp;#1089;&amp;#1077;&amp;#1085; &amp;#1086;&amp;#1090;&amp;#1085;&amp;#1086;&amp;#1089;&amp;#1080;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1086;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080;&amp;#1089;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1081;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt; Start(&lt;span style=&quot;color: #2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;TimeSpan&lt;/span&gt;&amp;gt; action)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt;(action);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
И пример использования:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt;.Start(t =&amp;gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(t)))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Thread&lt;/span&gt;.Sleep(1234); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1076;&amp;#1086;&amp;#1083;&amp;#1075;&amp;#1072;&amp;#1103; &amp;#1086;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Получилась достаточно удобная конструкция, допускающая вложенность любой глубины и разделяющая код на блоки: &lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt;.Start(t =&amp;gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(t)))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt;.Start(t =&amp;gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(t)))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1086;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; 1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Watcher&lt;/span&gt;.Start(t =&amp;gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(t)))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1086;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; 2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Класс Watcher не является законченным, его можно расширять на вкус и цвет. Например, если ведется лог, можно сбрасывать информацию сразу в лог, который можно получать при помощи &lt;a href=&quot;http://martinfowler.com/articles/injection.html&quot;&gt;IoC and DI pattern&lt;/a&gt;. Либо добавить header/footer информацию, которая будет записываться в лог при входе или выходе из блока.&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.diagnostics.stopwatch.aspx&quot;&gt;Stopwatch Class&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2010/10/stopwatch.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4345388133328748355</guid><pubDate>Fri, 24 Sep 2010 15:49:00 +0000</pubDate><atom:updated>2010-09-24T15:49:34.086+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><title>Шаблон реализации Equals</title><description>Работая с объектами, нам часто явно или неявно приходится их сравнивать их друг с другом. За сравнение объектов отвечает метод Equals или его типизированная версия из IEquatable, возвращающая true в случае если объекты равны, в противном случае false. Стандартная реализация метода Equals не всегда удовлетворяет потребностям разработчика, так как она не учитывает конкретных особенностей объекта, и в этом случае, реализация конкретного Equals/IEquatable ложится на плечи самого разработчика. Каждый разработчик вправе по-своему реализовать данную функциональность (не нарушая правил &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/336aedhh%28VS.71%29.aspx&quot;&gt;Implementing the Equals Method&lt;/a&gt;), как ему будет удобно. У меня, как у разработчика, на этот счет со временем выработался удобный шаблон реализации метода Equals/IEquatable, состоящий из 2-х простых правил:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;От простого к сложному&lt;/b&gt;: выполнять сравнение начиная с простых условий и заканчивая более сложными.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Понять равенство/неравенство объектов как можно раньше&lt;/b&gt;: делайте незамедлительный &quot;return true/false&quot;.&lt;/li&gt;
&lt;/ol&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Реализация шаблона на языке C# в комментариях на примере класса Foo:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IEquatable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; Equals(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; obj)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt; foo = obj &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;.Equals(foo);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; Equals(&lt;span style=&quot;color: #2b91af;&quot;&gt;Foo&lt;/span&gt; other)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1090; &amp;#1055;&amp;#1056;&amp;#1054;&amp;#1057;&amp;#1058;&amp;#1054;&amp;#1043;&amp;#1054; &amp;#1082;&amp;nbsp; &amp;#1057;&amp;#1051;&amp;#1054;&amp;#1046;&amp;#1053;&amp;#1054;&amp;#1052;&amp;#1059;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1042;&amp;#1099;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1085;&amp;#1103;&amp;#1081;&amp;#1090;&amp;#1077; &amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1085;&amp;#1072;&amp;#1095;&amp;#1080;&amp;#1085;&amp;#1072;&amp;#1103; &amp;#1089; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1099;&amp;#1093; &amp;#1091;&amp;#1089;&amp;#1083;&amp;#1086;&amp;#1074;&amp;#1080;&amp;#1081; (&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1082;&amp;#1072; &amp;#1085;&amp;#1072; null, &amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089;&amp;#1089;&amp;#1099;&amp;#1083;&amp;#1086;&amp;#1082;)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080; &amp;#1079;&amp;#1072;&amp;#1082;&amp;#1072;&amp;#1085;&amp;#1095;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1103; &amp;#1073;&amp;#1086;&amp;#1083;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1083;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1099;&amp;#1084;&amp;#1080; (&amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1080;&amp;#1084;&amp;#1086;&amp;#1075;&amp;#1086;).&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (other == &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// this &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1076;&amp;#1086;&amp;#1084;&amp;#1086; &amp;#1085;&amp;#1077; null.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;false&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;.ReferenceEquals(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;, other))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1086;&amp;#1073;&amp;#1077; &amp;#1089;&amp;#1089;&amp;#1099;&amp;#1083;&amp;#1082;&amp;#1080; &amp;#1089;&amp;#1089;&amp;#1099;&amp;#1083;&amp;#1072;&amp;#1102;&amp;#1090;&amp;#1089;&amp;#1103; &amp;#1085;&amp;#1072; &amp;#1086;&amp;#1076;&amp;#1080;&amp;#1085; &amp;#1080; &amp;#1090;&amp;#1086;&amp;#1090; &amp;#1078;&amp;#1077; &amp;#1086;&amp;#1073;&amp;#1098;&amp;#1077;&amp;#1082;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1080;&amp;#1084;&amp;#1086;&amp;#1075;&amp;#1086;. &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1076;&amp;#1077;&amp;#1089;&amp;#1100; &amp;#1086;&amp;#1087;&amp;#1080;&amp;#1096;&amp;#1080;&amp;#1090;&amp;#1077; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1082;&amp;#1088;&amp;#1077;&amp;#1090;&amp;#1085;&amp;#1086;&amp;#1077; &amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1086; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103;&amp;#1084;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1090; &amp;#1055;&amp;#1056;&amp;#1054;&amp;#1057;&amp;#1058;&amp;#1054;&amp;#1043;&amp;#1054; &amp;#1082;&amp;nbsp; &amp;#1057;&amp;#1051;&amp;#1054;&amp;#1046;&amp;#1053;&amp;#1054;&amp;#1052;&amp;#1059;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// 1. &amp;#1042;&amp;#1099;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1080;&amp;#1090;&amp;#1077; &amp;#1089;&amp;#1072;&amp;#1084;&amp;#1099;&amp;#1077; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1099;&amp;#1077; &amp;#1086;&amp;#1090;&amp;#1085;&amp;#1086;&amp;#1089;&amp;#1080;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1086; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1086;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080; &amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103; &amp;#1080; &amp;#1089;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1080;&amp;#1090;&amp;#1077; &amp;#1080;&amp;#1093; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1074;&amp;#1099;&amp;#1084;&amp;#1080;. &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1041;&amp;#1086;&amp;#1083;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1083;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1074;&amp;#1100;&amp;#1090;&amp;#1077; &amp;#1085;&amp;#1072; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1077;&amp;#1094;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// 2. &amp;#1044;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1081;&amp;#1090;&amp;#1077; &amp;#1085;&amp;#1077;&amp;#1079;&amp;#1072;&amp;#1084;&amp;#1077;&amp;#1076;&amp;#1083;&amp;#1080;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1081; &amp;quot;return false&amp;quot; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1088;&amp;#1080; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1074;&amp;#1086;&amp;#1084; &amp;#1078;&amp;#1077; &amp;#1085;&amp;#1077;&amp;#1089;&amp;#1086;&amp;#1074;&amp;#1087;&amp;#1072;&amp;#1076;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1080;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// 3. &amp;#1057;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1081;&amp;#1090;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103; &amp;#1082;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;&amp;#1072; &amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;&amp;#1086;&amp;#1084; Equals,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1079;&amp;#1072; &amp;#1080;&amp;#1089;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1099;&amp;#1093; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1086;&amp;#1074;: field.Equals(other.field)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// 4. &amp;#1053;&amp;#1077; &amp;#1079;&amp;#1072;&amp;#1073;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1081;&amp;#1090;&amp;#1077; &amp;#1074; &amp;#1082;&amp;#1086;&amp;#1085;&amp;#1094;&amp;#1077; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1090;&amp;#1100; base.Equals(other).&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/336aedhh%28VS.71%29.aspx&quot;&gt;Implementing the Equals Method&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2010/09/equals.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-3039770358146830651</guid><pubDate>Tue, 31 Aug 2010 12:45:00 +0000</pubDate><atom:updated>2010-08-31T14:57:54.723+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">XML</category><title>Enum поле в XML API</title><description>Проектируя публичное API очень важно понимать, что Ваше API будут использовать другие разработчики различного уровня, которые будут вынуждены разбираться в нем с нуля. Именно поэтому важную роль здесь играет простота и понятность созданного Вами API. Интуитивно-понятное API намного проще осваивать, и тем более использовать. Любое API подразумевает обмен сообщениями между &quot;клиентом&quot; и &quot;сервером&quot;, и зачастую такие сообщения удобно записывать в виде XML. Стандартная ситуация, Вы формируете некий XML и посылаете его на сервер, сервер разбирает его и отвечает Вам другим XML (XML API). К примеру, это может быть запрос аутентификации:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;auth&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;login&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;ilya&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;login&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;*****&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;auth&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
и соответственно ответ на запрос со стороны сервера будет выглядеть следующим образом:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;42&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1054;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1090;&amp;#1074;&amp;#1077;&amp;#1090;&amp;#1072;... &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
С подобным в своей практике мне приходилось сталкиваться ни раз, поэтому решил написать об этом пост. На первый взгляд в ответе с сервера нет ничего подозрительного, но это только кажется. К примеру мы никогда не узнаем что обозначает код возврата 42, не имея под рукой документации к API, google. Более того, имея под рукой документацию, нам каждый раз придется нырять в нее, уточняя каждый полученный статус, либо придется держать его в уме. Еще хуже, это унаследовать число 42 в следующей версии API, со ссылкой на предыдущую. &lt;br /&gt;
Но все не так уж и плохо, данную проблему можно устранить, если записывать все коды, статусы, enum-поля и подобное в виде строк:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;LoginIncorrect&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1054;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1090;&amp;#1074;&amp;#1077;&amp;#1090;&amp;#1072;... &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Код &quot;LoginIncorrect&quot; более информативен нежели код &quot;42&quot;. Даже не имея под рукой документации можно понять, что  аутентификация прошла неуспешно, потому что пользователь с логином &quot;ilya&quot; не зарегистрирован в системе. Можно возразить, что передавать &quot;LoginIncorrect&quot; вместо &quot;42&quot; расточительно, но это только кажется. В противном случае переходите на бинарный протокол обмена данными.&lt;br /&gt;
&lt;br /&gt;
Мой совет: всегда при проектировании внешнего XML API записываете все коды, статусы, enum-поля и подобное в виде строковых констант.&lt;br /&gt;
&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-Enum-%D0%BF%D0%BE%D0%BB%D0%B5-%D0%B2-XML-API&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F08%2Fenum-xml-api.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/08/enum-xml-api.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-22130479020647687</guid><pubDate>Thu, 05 Aug 2010 16:02:00 +0000</pubDate><atom:updated>2010-08-05T16:08:24.041+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><title>Marker Interface против Custom attributes</title><description>Бывают случаи, когда у разработчика C# возникает острая необходимость пометить некую сущность маркером (Marker), и в зависимости от типа маркера соответственно обрабатывать сущность. Например, Вы получаете сообщения, и для различных типов сообщений (но не для всех, а например только для типа MessageB) делаете запись в лог о их получении (например, в методе OnReceive(Message msg)):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt;{}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageA&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageB&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageC&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Существуют несколько способов решения данной задачи, и первое что приходит в голову написать следующее:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; OnReceive(&lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; msg)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(msg &lt;span style=&quot;color: blue;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageB&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1100; &amp;#1074; &amp;#1083;&amp;#1086;&amp;#1075;, &amp;#1095;&amp;#1090;&amp;#1086; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1083;&amp;#1080; &amp;#1089;&amp;#1086;&amp;#1086;&amp;#1073;&amp;#1097;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1090;&amp;#1080;&amp;#1087;&amp;#1072; B&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
очевидно, что такое быстрое решение не очень красивое, так если мы заходим логировать приход сообщения типа MessageC, то придется расширять if-условие.&lt;br /&gt;
Тогда на ум приходит идея ввести некий маркер, и если вспомнить про &lt;a href=&quot;http://en.wikipedia.org/wiki/Marker_interface_pattern&quot;&gt;Marker Interface pattern&lt;/a&gt;, то мы получим следующую реализацию:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ILogMarker&lt;/span&gt; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1091;&amp;#1089;&amp;#1090;&amp;#1086;, &amp;#1080;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1088;&amp;#1092;&amp;#1077;&amp;#1081;&amp;#1089;-&amp;#1084;&amp;#1072;&amp;#1088;&amp;#1082;&amp;#1077;&amp;#1088;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt;{}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageA&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1084;&amp;#1072;&amp;#1088;&amp;#1082;&amp;#1077;&amp;#1088;&amp;#1086;&amp;#1084; ILogMarker&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageB&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;ILogMarker&lt;/span&gt; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{ &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageC&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; OnReceive(&lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; msg)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(msg &lt;span style=&quot;color: blue;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;ILogMarker&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1100; &amp;#1074; &amp;#1083;&amp;#1086;&amp;#1075;, &amp;#1095;&amp;#1090;&amp;#1086; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1083;&amp;#1080; &amp;#1089;&amp;#1086;&amp;#1086;&amp;#1073;&amp;#1097;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1072;&amp;#1082; ILogMarker.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Уже намного лучше, условие if у нас уже фиксировано. Единственное что должно смутить, это странное сочетание типа MessageB и интерфейса ILogMarker, ведь ILogMarker несет в себе метаинформацию, а не саму информацию о типе.&lt;br /&gt;
Но на этом можно было бы и остановиться, если бы не наличие такого инструмента как &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa287992%28VS.71%29.aspx&quot;&gt;Custom attributes&lt;/a&gt;, и в этом случае, использовать &quot;Marker Interface&quot; при проектировании типов не рекомендуется (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms229022.aspx&quot;&gt;Interface Design&lt;/a&gt;: Avoid using marker interfaces (interfaces with no members)).&lt;br /&gt;
Итак, принимая во внимание данную рекомендацию:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// Custom attribute-&amp;#1084;&amp;#1072;&amp;#1088;&amp;#1082;&amp;#1077;&amp;#1088;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;LogAttrubute&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Attribute&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt;{}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageA&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1080;&amp;#1084; &amp;#1084;&amp;#1072;&amp;#1088;&amp;#1082;&amp;#1077;&amp;#1088;&amp;#1086;&amp;#1084; LogAttrubute&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;LogAttrubute&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageB&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;ILogMarker&lt;/span&gt; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{ &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MessageC&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; { }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; OnReceive(&lt;span style=&quot;color: #2b91af;&quot;&gt;Message&lt;/span&gt; msg)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (msg.GetType().IsDefined(&lt;span style=&quot;color: blue;&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: #2b91af;&quot;&gt;LogAttrubute&lt;/span&gt;), &lt;span style=&quot;color: blue;&quot;&gt;false&lt;/span&gt;))&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1100; &amp;#1074; &amp;#1083;&amp;#1086;&amp;#1075;, &amp;#1095;&amp;#1090;&amp;#1086; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1083;&amp;#1080; &amp;#1089;&amp;#1086;&amp;#1086;&amp;#1073;&amp;#1097;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1072;&amp;#1082; LogAttrubute.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Итого, мы получили фиксированное if-условие, метаданные о типе сообщения вынесены в Custom attributes, а не в сам тип в случае Marker Interface.&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1023068/what-is-the-purpose-of-a-marker-interface&quot;&gt;What is the purpose of a marker interface?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/3310936/interface-without-any-methods-bad-practice&quot;&gt;Interface without any methods - bad practice?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-Marker-Interface-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2-Custom-attributes&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F08%2Fmarker-interface-custom-attributes.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/08/marker-interface-custom-attributes.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-6135137647611129562</guid><pubDate>Tue, 03 Aug 2010 15:06:00 +0000</pubDate><atom:updated>2010-11-10T11:40:33.298+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Queueing</category><category domain="http://www.blogger.com/atom/ns#">ThreadSafe</category><title>NQueueing - Система Массового Обслуживания</title><description>Хочу представить Вам свою миниатюрную библиотеку (NQueueing), упрощающая C# .NET  разработчикам процесс разработки приложений, в которых присутствует  многопоточная обработка очередей (Система Массового Обслуживания (СМО)). Библиотеку NQueueing можно скачать с &lt;a href=&quot;http://nqueueing.codeplex.com/&quot;&gt;nqueueing.codeplex.com&lt;/a&gt; как в виде исходников, так и в виде готовой сборки.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Q: Зачем это?&lt;/b&gt;&lt;br /&gt;
A: Библиотека содержит расширяемый набор классов и интерфейсов, представляющих для .NET разработчика простой инструмент для реализации собственной СМО.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Пример использования?&lt;/b&gt;&lt;br /&gt;
A: Например, Вы пишете приложение которое принимает из сети пакеты, фильтрует, разбирает и складывает их в базу, при этом, каждый из перечисленных шагов выносится в отдельную СМО (отдельный(-ые) поток(и) со своей очередью). Обработка задач из очереди на каждом шаге происходит независимо от других шагов в отдельном потоке, что позволяет достичь максимальной производительности системы целиком.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Как устроена?&lt;/b&gt;&lt;br /&gt;
A: Основу библиотеки NQueueing представляет интерфейс IServerQueue.&lt;br /&gt;
&lt;center&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4039/5163191917_c30aae8f1a_m.jpg&quot; border=&quot;0&quot;/&gt;&lt;/center&gt;&lt;br /&gt;
Интерфейс является generic-типом, и типизируется типом задачи. Все обработчики очередей реализуют данный интерфейс.&lt;br /&gt;
Уровнем выше, находится абстрактный базовый класс для всех обработчиков очередей ServerQueueBase, инкапсулирующий в себя общие свойства любой СМО (например: объект очередь и массив потоков). &lt;br /&gt;
Следующий уровень абстракции - это конкретные реализации различных типов СМО, унаследованные от ServerQueueBase классы: StandartServerQueue (для поштучной обработки задач из очереди) и BatchServerQueue (для пакетной обработки):&lt;br /&gt;
&lt;center&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4148/5163799270_e679442071_b.jpg&quot; border=&quot;0&quot;/&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Как использовать?&lt;/b&gt;&lt;br /&gt;
A: Использовать библиотеку достаточно просто:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://nqueueing.codeplex.com/&quot;&gt;Скачать&lt;/a&gt; библиотеку.&lt;/li&gt;
&lt;li&gt;Добавить на нее reference в проекте. После чего станет доступен namespace NQueueing.&lt;/li&gt;
&lt;li&gt;В зависимости от типа задачи, выбрать соответствующий тип СМО (StandartServerQueue, BatchServerQueue итп).&lt;/li&gt;
&lt;li&gt;Далее создать экземпляр СМО (выбранной на предыдущем шаге), передав в конструктор ссылку на делегат, в котором и описывается процесс обработки пришедшей задачи, и указав параметры СМО: длина очереди, число потоков обработки.&lt;/li&gt;
&lt;li&gt;При помощи потоко-безопасных TryEnqueue/Enqueue ставить задачи в очередь.&lt;/li&gt;
&lt;/ol&gt;Простой пример:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; System;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; System.Threading;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1086;&amp;#1073;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1090;&amp;#1100; reference &amp;#1085;&amp;#1072; &amp;#1073;&amp;#1080;&amp;#1073;&amp;#1083;&amp;#1080;&amp;#1086;&amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; NQueueing;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;namespace&lt;/span&gt; NQueueingTestApp&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Program&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048;&amp;#1084;&amp;#1080;&amp;#1090;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1089;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1072;&amp;#1081;&amp;#1085;&amp;#1086;&amp;#1081; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1082;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Random&lt;/span&gt; rnd = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Random&lt;/span&gt;(&lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt;.Now.Millisecond);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; RandomSleep(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; min, &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; max)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Thread&lt;/span&gt;.Sleep(rnd.Next(min, max));&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ProcessingOne(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; item)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1079;&amp;#1076;&amp;#1077;&amp;#1089;&amp;#1100; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1091; item...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1082;&amp;#1072; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090; &amp;#1074; &amp;#1086;&amp;#1090;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1086;&amp;#1084; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1077;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RandomSleep(10, 300); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1072;&amp;#1081;&amp;#1085;&amp;#1072;&amp;#1103; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1082;&amp;#1072; &amp;#1074; &amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1082;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1088; &amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1075;&amp;#1086; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1072;, &amp;#1086;&amp;#1090; 0 &amp;#1076;&amp;#1086; (maxThreadsCount-1)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; name = &lt;span style=&quot;color: #2b91af;&quot;&gt;Thread&lt;/span&gt;.CurrentThread.Name;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;{0} / Thread &amp;#8470;: {1}&amp;quot;&lt;/span&gt;, item, name);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;[] args)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1086;&amp;#1079;&amp;#1076;&amp;#1072;&amp;#1076;&amp;#1080;&amp;#1084; &amp;#1057;&amp;#1080;&amp;#1089;&amp;#1090;&amp;#1077;&amp;#1084;&amp;#1091; &amp;#1052;&amp;#1072;&amp;#1089;&amp;#1089;&amp;#1086;&amp;#1074;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1054;&amp;#1073;&amp;#1089;&amp;#1083;&amp;#1091;&amp;#1078;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1097;&amp;#1091;&amp;#1102; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080;&amp;#1079; 3-&amp;#1093; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1074; &amp;#1080; &amp;#1086;&amp;#1095;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1100;&amp;#1102; &amp;#1076;&amp;#1083;&amp;#1080;&amp;#1085;&amp;#1099; 10.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;IServerQueue&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;gt; smo = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;StandartServerQueue&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;gt;(ProcessingOne, 10, 3);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; smo.Start(); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1047;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1094;&amp;#1077;&amp;#1089;&amp;#1089; &amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1082;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1086;&amp;#1073;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1084; 15 &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095; &amp;#1074; &amp;#1086;&amp;#1095;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1100;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; task = 0; task &amp;lt; 15; task++)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1084; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1091; &amp;#1074; &amp;#1086;&amp;#1095;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1100; &amp;#1074; &amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1077;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;EnqueueStatus&lt;/span&gt; result = smo.TryEnqueue(task);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RandomSleep(10, 100); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1057;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1072;&amp;#1081;&amp;#1085;&amp;#1072;&amp;#1103; &amp;#1079;&amp;#1072;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1082;&amp;#1072; &amp;#1087;&amp;#1088;&amp;#1080; &amp;#1076;&amp;#1086;&amp;#1073;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;{0} / Enqueue: {1}&amp;quot;&lt;/span&gt;, task, result);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; smo.Close(); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1077; &amp;#1079;&amp;#1072;&amp;#1073;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1080;&amp;#1090;&amp;#1100;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.ReadKey();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Расширяемость?&lt;/b&gt;&lt;br /&gt;
A: Да, такая возможность есть. Для этого необходимо реализовать интерфейс IServerQueue, либо реализовать наследника  от базового класса ServerQueueBase.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Буду благодарен за Ваши отзывы, рекомендации и конструктивные советы.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Queueing_model&quot;&gt;Queueing model&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://www.handcode.ru/2010/08/nqueueing.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4039/5163191917_c30aae8f1a_t.jpg" height="72" width="72"/><thr:total>22</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-2867357403577166971</guid><pubDate>Thu, 22 Jul 2010 15:58:00 +0000</pubDate><atom:updated>2010-07-22T18:18:20.407+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><title>Раcширяем IDisposable</title><description>Наверняка Вы сталкивались с ситуацией, когда Вам требуется совершить явный вызов метода Dispose у объекта, реализующего интерфейс IDisposable, при этом, для каждого такого Dispose-вызова приходиться постоянно писать одинаковый код, по следующему шаблону (проверка на null, вызов IDisposable.Dispose):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1089;&amp;#1074;&amp;#1086;&amp;#1073;&amp;#1086;&amp;#1078;&amp;#1076;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1088;&amp;#1077;&amp;#1089;&amp;#1091;&amp;#1088;&amp;#1089;&amp;#1086;&amp;#1074;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (some != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; some.Dispose();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Раз этот код сильно похож и выделяется в шаблон, то его логично вынести в отдельный метод, а еще лучше в &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb383977.aspx&quot;&gt;Extension Method&lt;/a&gt; для типа IDisposable:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposableExtention&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1041;&amp;#1077;&amp;#1079;&amp;#1086;&amp;#1087;&amp;#1072;&amp;#1089;&amp;#1085;&amp;#1099;&amp;#1081;, &amp;#1086;&amp;#1090;&amp;#1085;&amp;#1086;&amp;#1089;&amp;#1080;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1086; NullReferenceException Dispose&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; SafeDispose(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt; self)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (self != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.Dispose();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
После чего, искомые четыре строчки кода для Dispose-вызова свернуться до одной - вызова нашего метода SafeDispose:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;some.SafeDispose();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;some.SafeDispose(); &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1088;&amp;#1080; &amp;#1087;&amp;#1086;&amp;#1074;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1085;&amp;#1086;&amp;#1084; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1077; &amp;#1085;&amp;#1080;&amp;#1095;&amp;#1077;&amp;#1075;&amp;#1086; &amp;#1085;&amp;#1077; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1079;&amp;#1086;&amp;#1081;&amp;#1076;&amp;#1077;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-%D0%A0%D0%B0c%D1%88%D0%B8%D1%80%D1%8F%D0%B5%D0%BC-IDisposable&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F07%2Fc-idisposable.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/07/c-idisposable.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>30</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-7837078164167886041</guid><pubDate>Thu, 17 Jun 2010 12:29:00 +0000</pubDate><atom:updated>2010-06-17T12:37:14.368+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><title>Блок using и null object</title><description>Интересное поведение наблюдается, если в блоке using используется нулевой объект: using(null){...}. Казалось бы, очевидно, у нас должно возникнуть исключение NullReferenceException при попытке вызвать метод Dispose нулевого объекта (null object), как только мы выйдем за пределы блока using:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; ((&lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt;)&lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048;&amp;#1089;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; NullReferenceException &amp;#1085;&amp;#1077; &amp;#1073;&amp;#1091;&amp;#1076;&amp;#1077;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1052;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; Dispose &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1085; &amp;#1085;&amp;#1077; &amp;#1073;&amp;#1091;&amp;#1076;&amp;#1077;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Рассмотрим довольно распространенную конструкцию: Допустим, есть класс Some, реализующий интерфейс IDisposable:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; : &lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Dispose()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;dispose&amp;quot;&lt;/span&gt;);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
и статический метод (например, это может быть какой-нибудь builder), возвращающий экземпляр Some:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; GetSome()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1058;&amp;#1072;&amp;#1082; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1080;&amp;#1083;&amp;#1086;&amp;#1089;&amp;#1100;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1074;&amp;#1077;&amp;#1088;&amp;#1085;&amp;#1091;&amp;#1083;&amp;#1080; null&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Вопрос: &lt;i&gt;&quot;Возникнет ли NullReferenceException исключение, когда мы выйдем за пределы блока using?&quot;.&lt;/i&gt;:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some = GetSome())&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (some != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1077;&amp;#1081;&amp;#1089;&amp;#1090;&amp;#1074;&amp;#1080;&amp;#1103; &amp;#1089; some...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;span style=&quot;color: green;&quot;&gt;// IDisposable.Dispose()&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Ответ: &lt;i&gt;&quot;Нет, метод Dispose объекта some в данной ситуации вызван не будет.&quot;.&lt;/i&gt;&lt;br /&gt;
На самом деле, блок using будет оттранслирован в блок try...finally с проверкой на null:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;Some&lt;/span&gt; some = GetSome();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (some != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1077;&amp;#1081;&amp;#1089;&amp;#1090;&amp;#1074;&amp;#1080;&amp;#1103; &amp;#1089; some...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;finally&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (some != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt;)some).Dispose();&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Или:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;.method &lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt; hidebysig &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp; Main(&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;[] args) cil managed&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; .entrypoint&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Code size&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 39 (0x27)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; .maxstack&amp;nbsp; 2&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; .locals init ([0] &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;NullUsing&lt;/span&gt;.Some some,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; [1] &lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; CS$4$0000)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; IL_0000:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; IL_0001:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;NullUsing&lt;/span&gt;.Some &lt;span style=&quot;color: #2b91af;&quot;&gt;NullUsing&lt;/span&gt;.Program::GetSome()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; IL_0006:&amp;nbsp; stloc.0&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; .&lt;span style=&quot;color: blue;&quot;&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0007:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0008:&amp;nbsp; ldloc.0&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0009:&amp;nbsp; ldnull&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000a:&amp;nbsp; ceq&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000c:&amp;nbsp; stloc.1&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000d:&amp;nbsp; ldloc.1&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000e:&amp;nbsp; brtrue.s&amp;nbsp;&amp;nbsp; IL_0012&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0010:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0011:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0012:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0013:&amp;nbsp; leave.s&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0025&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; }&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// end .try&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;finally&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0015:&amp;nbsp; ldloc.0&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0016:&amp;nbsp; ldnull&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0017:&amp;nbsp; ceq&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0019:&amp;nbsp; stloc.1&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001a:&amp;nbsp; ldloc.1&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001b:&amp;nbsp; brtrue.s&amp;nbsp;&amp;nbsp; IL_0024&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001d:&amp;nbsp; ldloc.0&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001e:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; [mscorlib]System.&lt;span style=&quot;color: #2b91af;&quot;&gt;IDisposable&lt;/span&gt;::Dispose()&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0023:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0024:&amp;nbsp; endfinally&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; }&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// end handler&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; IL_0025:&amp;nbsp; nop&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; IL_0026:&amp;nbsp; ret&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;} &lt;span style=&quot;color: green;&quot;&gt;// end of method Program::Main&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/yh598w02.aspx&quot;&gt;using Statement (C# Reference)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/2522822/c-using-statement-with-a-null-object&quot;&gt;C# using statement with a null object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/2513035&quot;&gt;Dynamics of the using keyword&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-%D0%91%D0%BB%D0%BE%D0%BA-using-%D0%B8-null-object&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F06%2Fusing-null-object.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/06/using-null-object.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1680717789242201174</guid><pubDate>Thu, 03 Jun 2010 12:13:00 +0000</pubDate><atom:updated>2010-06-03T12:20:40.087+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><title>Enum как результат</title><description>Иногда, бывает очень удобно возвращать результат работы сервис-метода в качестве Enum значения. Представим ситуацию: Вы пишите сервис-метод, который возвращает два возможных состояния true/false (область значений), как бы Вы поступили, ограничились бы стандартным типом Bool или все-таки ввели бы новый Enum? Идея оставить Bool не совсем удачна, если вдруг придется расширить область значений сервис-метода. Например, в задаче аутентификации пользователя, где помимо информации об удаче/неудаче необходимо указать, в чем состоит неудача аутентификации, в итоге получим 4 возможных результата: &quot;успех&quot; (Ok), &quot;провал&quot; (Fail), &quot;логин не верен&quot; (LoginIncorrect), &quot;пароль не верен&quot; (PasswordIncorrect):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1077;&amp;#1079;&amp;#1091;&amp;#1083;&amp;#1100;&amp;#1090;&amp;#1072;&amp;#1090; &amp;#1072;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1089;&amp;#1087;&amp;#1077;&amp;#1093;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok = 0,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fail = (2 &amp;lt;&amp;lt; 1),&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1090;&amp;#1086;&amp;#1095;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084;, &amp;#1074; &amp;#1095;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LoginIncorrect = (2 &amp;lt;&amp;lt; 2),&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PasswordIncorrect = (2 &amp;lt;&amp;lt; 3)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
На этом можно было бы и закончить, но возможно, Вы возразите мне: &lt;i&gt;&quot;А как связаны статусы: Fail и PasswordIncorrect ? Интуитивно понятно, что связь между статусами есть.&quot;&lt;/i&gt;. Проблема решается просто на уровне битовых полей и флагов, давайте свяжем эти статусы следующим образом: статус PasswordIncorrect, это тот же статус Fail, но с небольшим уточнением в виде одного бита (2 &amp;lt;&amp;lt; 3):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1077;&amp;#1079;&amp;#1091;&amp;#1083;&amp;#1100;&amp;#1090;&amp;#1072;&amp;#1090; &amp;#1072;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;Flags&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1089;&amp;#1087;&amp;#1077;&amp;#1093;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok = 0,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fail = (2 &amp;lt;&amp;lt; 1),&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1090;&amp;#1086;&amp;#1095;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084;, &amp;#1074; &amp;#1095;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LoginIncorrect = (2 &amp;lt;&amp;lt; 2) | Fail,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PasswordIncorrect = (2 &amp;lt;&amp;lt; 3) | Fail&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Вот это уже намного лучше. Осталось привести пример использования:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; ((&lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.Fail &amp;amp; status) == &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.Fail)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1040;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1096;&amp;#1080;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1100; &amp;#1085;&amp;#1077;&amp;#1091;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1081;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1080; &amp;#1085;&amp;#1077; &amp;#1074;&amp;#1072;&amp;#1078;&amp;#1085;&amp;#1086;, &amp;#1087;&amp;#1086;&amp;#1095;&amp;#1077;&amp;#1084;&amp;#1091;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; ((&lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.LoginIncorrect &amp;amp; status) == &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.LoginIncorrect)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1040;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1096;&amp;#1080;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1100; &amp;#1085;&amp;#1077;&amp;#1091;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1081;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1072;&amp;#1082; &amp;#1084;&amp;#1080;&amp;#1085;&amp;#1080;&amp;#1084;&amp;#1091;&amp;#1084; &amp;#1083;&amp;#1086;&amp;#1075;&amp;#1080;&amp;#1085; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1103; &amp;#1085;&amp;#1077; &amp;#1089;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1089;&amp;#1090;&amp;#1074;&amp;#1091;&amp;#1077;&amp;#1090;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; ((&lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.PasswordIncorrect &amp;amp; status) == &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;.PasswordIncorrect)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1040;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1096;&amp;#1080;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1100; &amp;#1085;&amp;#1077;&amp;#1091;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1081;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1082;&amp;#1072;&amp;#1082; &amp;#1084;&amp;#1080;&amp;#1085;&amp;#1080;&amp;#1084;&amp;#1091;&amp;#1084; &amp;#1087;&amp;#1072;&amp;#1088;&amp;#1086;&amp;#1083;&amp;#1100; &amp;#1091;&amp;#1082;&amp;#1072;&amp;#1079;&amp;#1072;&amp;#1085; &amp;#1085;&amp;#1077;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1085;&amp;#1086;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Допустим, мы ввели еще один статус &quot;Пароль имеет пустое значение&quot; (PasswordIsEmpty), тогда мы с легкостью сможем расширить наш Enum следующим образом:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1056;&amp;#1077;&amp;#1079;&amp;#1091;&amp;#1083;&amp;#1100;&amp;#1090;&amp;#1072;&amp;#1090; &amp;#1072;&amp;#1091;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;Flags&lt;/span&gt;]&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;LoginStatus&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1089;&amp;#1087;&amp;#1077;&amp;#1093;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok = 0,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fail = (2 &amp;lt;&amp;lt; 1),&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1059;&amp;#1090;&amp;#1086;&amp;#1095;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084;, &amp;#1074; &amp;#1095;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1072;&amp;#1083;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LoginIncorrect = (2 &amp;lt;&amp;lt; 2) | Fail,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PasswordIncorrect = (2 &amp;lt;&amp;lt; 3) | Fail,&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1091;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1081; &amp;#1087;&amp;#1072;&amp;#1088;&amp;#1086;&amp;#1083;&amp;#1100;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PasswordIsEmpty = (2 &amp;lt;&amp;lt; 4) | PasswordIncorrect&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Достоинства:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Никаких magic-constants.&lt;/li&gt;
&lt;li&gt;Простота и легкость расширения.&lt;/li&gt;
&lt;li&gt;Установление взаимосвязей за счет комбинирования.&lt;/li&gt;
&lt;/ol&gt;Недостатки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Ограничение числа возможных статусов разрядностью Enum.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc138362%28VS.90%29.aspx&quot;&gt;Enumeration Types (C# Programming Guide)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-Enum-%D0%BA%D0%B0%D0%BA-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F06%2Fenum.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/06/enum.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>15</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-3452674451598236901</guid><pubDate>Thu, 27 May 2010 12:41:00 +0000</pubDate><atom:updated>2010-05-27T12:39:58.600+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><category domain="http://www.blogger.com/atom/ns#">XML</category><category domain="http://www.blogger.com/atom/ns#">XSD</category><title>XML elements или XML attributes</title><description>Всегда проектируя структуру XML файла, Вы наверняка задумывались, где хранить данные: в атрибуте (XML attribute) или все-таки в узле (XML element). Это довольно важный вопрос, который нужно решить раз и навсегда еще на этапе проектирования XSD схемы, иначе последующее переделывание XSD схемы не есть хорошая практика. Обратите внимание на два XML файла:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1061;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1084; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1074; &amp;#1072;&amp;#1090;&amp;#1088;&amp;#1080;&amp;#1073;&amp;#1091;&amp;#1090;&amp;#1077; &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;child&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;some data&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;child&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1061;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1084; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1074; &amp;#1091;&amp;#1079;&amp;#1083;&amp;#1077; &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;child&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; some data&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;child&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Приведенные выше две XML-разметки несут в себе одинаковую информацию, но структурированы по-разному, в первом случае наши данные хранятся в атрибуте, а во втором непосредственно в узле. Для того, чтобы определить какой из случаев предпочтительнее, необходимо знать, какими ограничениями обладает каждый из случаев:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Узел не может содержать несколько атрибутов, с одинаковыми именами.&lt;/li&gt;
&lt;li&gt;Узел можно легко расширить, добавив в него дочерние элементы (узлы или атрибуты).&lt;/li&gt;
&lt;li&gt;Узлы упорядочены между собой, атрибуты нет.&lt;/li&gt;
&lt;li&gt;Узлы могут хранить секцию CDATA, атрибутам приходиться хранить экранированные значения.&lt;/li&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;Хорошей практикой считается хранить в атрибутах метаданные (metadata), а в узлах сами данные (!)&lt;/p&gt;&lt;p&gt;Резюмируя, можно сказать, что ID, Name, Date, Money и подобное лучше хранить а атрибутах, большие тексты, данные (нуждающиеся в экранировании), списки, тем более данные, которые можно представить в виде структуры, храните в узлах. &lt;/p&gt;&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1053;&amp;#1077;&amp;#1091;&amp;#1076;&amp;#1072;&amp;#1095;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090; &amp;#1088;&amp;#1072;&amp;#1079;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1082;&amp;#1080;. &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;body - &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1077;&amp;#1090; &amp;#1089;&amp;#1086;&amp;#1076;&amp;#1077;&amp;#1088;&amp;#1078;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1089;&amp;#1087;&amp;#1077;&amp;#1094;. &amp;#1089;&amp;#1080;&amp;#1084;&amp;#1074;&amp;#1086;&amp;#1083;&amp;#1099;, &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;#1073;&amp;#1099;&amp;#1090;&amp;#1100; &amp;#1076;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1090;&amp;#1086;&amp;#1095;&amp;#1085;&amp;#1086; &amp;#1076;&amp;#1083;&amp;#1080;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1084; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1077;&amp;#1084;, &amp;#1080; &amp;#1085;&amp;#1077;&amp;#1090;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;#1075;&amp;#1072;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1081;, &amp;#1095;&amp;#1090;&amp;#1086; &amp;#1086;&amp;#1085;&amp;#1086; &amp;#1074; &amp;#1076;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1077;&amp;#1081;&amp;#1096;&amp;#1077;&amp;#1084; &amp;#1085;&amp;#1077; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;#1088;&amp;#1072;&amp;#1089;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1080;&amp;#1090;&amp;#1089;&amp;#1103; &amp;#1076;&amp;#1086;&amp;#1095;&amp;#1077;&amp;#1088;&amp;#1085;&amp;#1080;&amp;#1084;&amp;#1080; &amp;#1091;&amp;#1079;&amp;#1083;&amp;#1072;&amp;#1084;&amp;#1080;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;123&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;Hello world&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1059;&amp;#1085;&amp;#1080;&amp;#1074;&amp;#1077;&amp;#1088;&amp;#1089;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090;, &amp;#1093;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1084; &amp;#1074;&amp;#1089;&amp;#1077; &amp;#1074; &amp;#1091;&amp;#1079;&amp;#1083;&amp;#1072;&amp;#1093;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;#1052;&amp;#1085;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1090;&amp;#1077;&amp;#1082;&amp;#1089;&amp;#1090;&amp;#1072; &amp;#1080; &amp;#1074;&amp;#1099;&amp;#1075;&amp;#1083;&amp;#1103;&amp;#1076;&amp;#1080;&amp;#1090; &amp;#1085;&amp;#1077;&amp;#1084;&amp;#1085;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1075;&amp;#1088;&amp;#1086;&amp;#1084;&amp;#1086;&amp;#1079;&amp;#1076;&amp;#1082;&amp;#1086;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;123&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;Hello world&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; &amp;#1054;&amp;#1087;&amp;#1090;&amp;#1080;&amp;#1084;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1072;&amp;#1088;&amp;#1080;&amp;#1072;&amp;#1085;&amp;#1090;. &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;123&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hello world&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.w3schools.com/DTD/dtd_el_vs_attr.asp&quot;&gt;Use of Elements vs. Attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/xml/library/x-eleatt.html&quot;&gt;Principles of XML design: When to use elements versus attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/33746/xml-attribute-vs-xml-element&quot;&gt;XML attribute vs XML element&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/2469133/xml-attributes-or-element-nodes&quot;&gt;XML Attributes or Element Nodes?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-XML-elements-%D0%B8%D0%BB%D0%B8-XML-attributes&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F05%2Fxml-elements-xml-attributes.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/05/xml-elements-xml-attributes.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4598562858899341123</guid><pubDate>Fri, 14 May 2010 18:07:00 +0000</pubDate><atom:updated>2010-05-21T18:33:32.671+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">ThreadSafe</category><title>Thread-safe events</title><description>Если Вы пишите многопоточное приложение, то всегда стоит задумываться о потоко-безопасности (thread safe). Сегодня затронем важную тему про то, как правильно возбуждать событие (event raise), доступ к которому осуществляется в нескольких потоках. &lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;SomeClass&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1044;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1091;&amp;#1087; &amp;#1082; &amp;#1076;&amp;#1072;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1084;&amp;#1091; &amp;#1089;&amp;#1086;&amp;#1073;&amp;#1099;&amp;#1090;&amp;#1080;&amp;#1102; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1080;&amp;#1089;&amp;#1093;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1074; &amp;#1085;&amp;#1077;&amp;#1089;&amp;#1082;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1082;&amp;#1080;&amp;#1093; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1072;&amp;#1093;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;event&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; SomeEvent;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Стандартный, потоко-безопасный (thread safe) шаблон вызова события выглядит следующим образом:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1055;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;-&amp;#1073;&amp;#1077;&amp;#1079;&amp;#1086;&amp;#1087;&amp;#1072;&amp;#1089;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; OnSomeEventThreadSafe(&lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt; args)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1054;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1100; &amp;#1074;&amp;#1072;&amp;#1078;&amp;#1085;&amp;#1086;, &amp;#1089;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1082;&amp;#1086;&amp;#1087;&amp;#1080;&amp;#1102; &amp;#1089;&amp;#1086;&amp;#1073;&amp;#1099;&amp;#1090;&amp;#1080;&amp;#1103;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; handler = SomeEvent;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1048; &amp;#1076;&amp;#1072;&amp;#1083;&amp;#1077;&amp;#1077; &amp;#1088;&amp;#1072;&amp;#1073;&amp;#1086;&amp;#1090;&amp;#1072;&amp;#1090;&amp;#1100; &amp;#1090;&amp;#1086;&amp;#1083;&amp;#1100;&amp;#1082;&amp;#1086; &amp;#1089; &amp;#1085;&amp;#1077;&amp;#1081;:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (handler != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;, args);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Зачем, нам работать с копией, если мы можем и с оригиналом? Если коротко, то при многопоточном доступе к событию SomeEvent, у нас может возникнуть исключение. Например, если второй поток удалит последний зарегистрированный delegate из SomeEvent, в то время как в первом потоке проверка SomeEvent!=null была успешно пройдена.&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// &amp;#1053;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;-&amp;#1073;&amp;#1077;&amp;#1079;&amp;#1086;&amp;#1087;&amp;#1072;&amp;#1089;&amp;#1085;&amp;#1099;&amp;#1081; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; OnSomeEvent(&lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt; args)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (SomeEvent != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// SomeEvent - &amp;#1084;&amp;#1086;&amp;#1078;&amp;#1077;&amp;#1090; &amp;#1086;&amp;#1082;&amp;#1072;&amp;#1079;&amp;#1072;&amp;#1090;&amp;#1100;&amp;#1089;&amp;#1103; &amp;#1088;&amp;#1072;&amp;#1074;&amp;#1085;&amp;#1099;&amp;#1084; null.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SomeEvent(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;, args);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Видно, что при добавлении нового события, при потоко-безопасном подходе приходится дублировать один и тот же кусок кода (копирование-проверка-вызов). Данное дублирование можно избежать, если вынести всю логику в метод-расширение (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb383977.aspx&quot;&gt;Extension Methods&lt;/a&gt;):&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandlerExt&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// &amp;#1052;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; &amp;#1088;&amp;#1072;&amp;#1089;&amp;#1096;&amp;#1080;&amp;#1088;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077;, &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1088;&amp;#1075;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;-&amp;#1073;&amp;#1077;&amp;#1079;&amp;#1086;&amp;#1087;&amp;#1072;&amp;#1089;&amp;#1085;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1074;&amp;#1099;&amp;#1079;&amp;#1086;&amp;#1074;&amp;#1072; &amp;#1089;&amp;#1086;&amp;#1073;&amp;#1099;&amp;#1090;&amp;#1080;&amp;#1103;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Raise(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; self, &lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt; args)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; handler = self;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (handler != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(sender, args);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
Использование:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;SomeEvent.Raise(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPD:&lt;/b&gt;&lt;br /&gt;
Хотя Рихтер рекомендует использовать в качестве &quot;копирования&quot; следующее:&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;&lt;br /&gt;
&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; temp = &lt;span style=&quot;color: #2b91af;&quot;&gt;Thread&lt;/span&gt;.VolatileRead(&lt;span style=&quot;color: blue;&quot;&gt;ref&lt;/span&gt; SomeEvent);&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;//&amp;#1080;&amp;#1083;&amp;#1080;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt; temp = &lt;span style=&quot;color: #2b91af;&quot;&gt;Interlocked&lt;/span&gt;.CompareExchange(&lt;span style=&quot;color: blue;&quot;&gt;ref&lt;/span&gt; SomeEvent, &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;
объясняя это следующим:&lt;br /&gt;
&lt;q&gt;Remember that delegates are immutable and this is why this technique works in theory. However, what a lot of developers don’t realize is that this code could be optimized by the compiler to remove the local temp variable entirely.... so a NullReferenceException is still possible.&lt;/q&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ссылки:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/786383/c-events-and-thread-safety&quot;&gt;C# Events and Thread Safety&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/282653/checking-for-null-before-event-dispatching-thread-safe&quot;&gt;Checking for null before event dispatching...thread safe?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx&quot;&gt;Events and Races&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;a rev=&quot;vote-for&quot; href=&quot;http://progg.ru/handcode-Thread-safe-events&quot;&gt;&lt;img alt=&quot;Progg it&quot; src=&quot;http://progg.ru/image.axd?url=http%3A%2F%2Fwww.handcode.ru%2F2010%2F05%2Fthread-safe-events.html&quot; style=&quot;border:0px&quot;/&gt;&lt;/a&gt;</description><link>http://www.handcode.ru/2010/05/thread-safe-events.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>9</thr:total></item></channel></rss>