<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5422036137568788209</atom:id><lastBuildDate>Thu, 16 Feb 2012 15:18:20 +0000</lastBuildDate><category>AOP</category><category>Builder</category><category>math</category><category>Config</category><category>Fluent interface</category><category>Doc</category><category>MVC</category><category>XSD</category><category>FIX/FAST</category><category>cache</category><category>CodeContract</category><category>Adapter</category><category>VisualStudio</category><category>ASP</category><category>XML</category><category>Mock</category><category>T4</category><category>Security</category><category>Fun</category><category>Log</category><category>Hello</category><category>Best Practices</category><category>Queueing</category><category>Diagnostic</category><category>WCF</category><category>Linq</category><category>UnitTesting</category><category>EF</category><category>performance</category><category>Patterns</category><category>DDD</category><category>IoC/DI</category><category>ThreadSafe</category><category>.NET</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>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Handcode" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="handcode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Handcode" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FHandcode" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><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#">Patterns</category><category domain="http://www.blogger.com/atom/ns#">FIX/FAST</category><title>Adapter pattern. Понимание важности.</title><link>http://www.handcode.ru/2011/11/adapter-pattern.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>1</thr:total><description>Перед большинством проектов рано или поздно встает главный вопрос: "Использовать стороннюю компоненту или реализовать свою?", и как это часто бывает, по причине того что использовать уже существующее гораздо проще, чем создавать это заново мы выбираем уже готовое решение.



Предположим, мы решили использовать уже готовую компоненту, тогда остается выбрать какую именно, но если выбор велик, то перед нами возникает проблема выбора, так как у каждой компоненты различные интерфейсы, различные характеристики...</description></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#">Mock</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><title>Mock для ICloneable типов</title><link>http://www.handcode.ru/2011/08/mock-iclonable.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total><description>Буквально недавно я столкнулся с задачей, суть которой заключалась в том, чтобы создать mock объект реализующий интерфейс ICloneable, например средствами Moq. 

В моей ситуации, было все просто: метод Clone должен возвращать объект (которого на самом деле нет), с наперед известными данными (которые не подлежали бы изменениям). Для наглядности лучше привести исходный код. 

Пусть это будет следующий интерфейс:

public interface ISome : ICloneable{&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;#1085;&amp;#1077;&amp;#1082;&amp;#1086;&amp;#1077;...</description></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#">CodeContract</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><title>Проверяем входные данные</title><link>http://www.handcode.ru/2011/05/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total><description>Все программисты знают, что пришедшие из внешнего источника данные всегда надо проверять. Например в качестве входного параметра для метода (свойства, конструктора), может приходить ссылка, которую нужно проверить на null, число, которое должно быть из определенного диапазона, или определенного вида строка. Несмотря на то, что по этому поводу даже существует методика разработки через Code Contracts, по-прежнему, с высокой вероятностью в проекте можно встретить код проверки на null аналогичный...</description></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#">IoC/DI</category><category domain="http://www.blogger.com/atom/ns#">AOP</category><title>AOP средствами Unity 2.0</title><link>http://www.handcode.ru/2011/04/aop-unity-20.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>9</thr:total><description>В этой статье рассмотрим простой пример реализации AOP (Aspect-Oriented Programming) средствами Unity 2.0. Итак, Unity представляет собой DI/IoC контейнер, с возможностью вносить в него новую функциональность или поведение через стандартные или пользовательские расширения (Extentions).Благодаря этой возможности Unity, мы можем написать свое или воспользоваться уже готовым расширением и реализовать AOP в нашем .NET приложении. Стандартный подход при реализации AOP средствами Unity является использование...</description></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#">EF</category><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Hello</category><title>Hello, Entity Framework "Code-First"</title><link>http://www.handcode.ru/2011/04/hello-entity-framework-code-first.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>10</thr:total><description>В этой статье рассмотрим простой пример, демонстрирующий новый способ разработки через "Code-first" для Entity Framework 4. В первую очередь, Entity Framework 4 Code-First нацелен на разработчиков, сфокусированных на Domain-driven design (DDD).

Предположим у нас имеется электронный магазин, в котором ведется два списка: список покупателей (Customers) и список заказов (Orders), которые храняться в базе данных ShopDb. Необходимо реализовать CRUD доступ над указанными сущностями в базе данных, используя весь...</description></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>2011-03-10T16:52:03.974+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#">WCF</category><title>Caching в WCF сервисе</title><link>http://www.handcode.ru/2011/03/caching-wcf.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total><description>Кэширование данных неотъемлемая часть высоконагруженных и ресурсоемких проектов. В этой статье я опишу процесс организации оптимального механизма кэширования в WCF сервисе. Сформулирую задачу: имея WCF сервис, нужно организовать кеширование результатов работы любого сервис-метода в зависимости от входных параметров (Caching Support for WCF Services). Существует множество решений поставленной задачи, и самое простое и очевидное, это организовать кэширование прямо в сервис-методе:



public DateTime...</description></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><link>http://www.handcode.ru/2011/01/iocdi-wcf-unity-20.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>1</thr:total><description>В этой статье я продемонстрирую процесс внедрения IoC/DI контейнера (на примере Unity 2.0) в WCF сервис. В примере я выбрал Unity 2.0, но на самом деле это не существенно, и по желанию можно легко адаптировать код под другой IoC/DI контейнер. Для тех кто не знаком еще с данным контейнером, рекомендую глянуть вводную статью. Существуют несколько путей внедрения IoC/DI контейнера в WCF сервис, рассмотрим один из них*.

Итак, предже чем приступить к реализации наметим основные шаги:

Для начала создадим...</description></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><link>http://www.handcode.ru/2010/12/blog-post.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>6</thr:total><description>Вчера вспомнил про одну интересную задачу, в которой необходимо было построить ключ для множества. Задача заключалась в построении коммутативного оператора над множеством, причем результат операции должен быть уникален для каждого множества.


Сформулируем требование следующим образом: найти такой оператор F, что для любого набора (u, v, ...) будет выполнено:

F(u, v, ...)= F(v, u, ...)=F(всевозможные перестановки) (условие коммутативности), причем не существует любого другого элемента z != u, такого что...</description></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#">T4</category><category domain="http://www.blogger.com/atom/ns#">Hello</category><title>Используем Reflection в T4  (Text Template Transformation Toolkit)</title><link>http://www.handcode.ru/2010/12/reflection-t4-text-template.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total><description>Недавно, мне была поставлена следующая задача: для каждого класса из стороннего API, разработать обертку (wrapper class), для удобства использования стороннего API. Оптимальное решение подобных задач всегда использовать кодогенерацию, а наиболее удобный инструмент для этого, это T4 (Text Template Transformation Toolkit). Так как набор классов находился в уже скомпилированной сборке, то действовать надо было только через System.Reflection. Как выяснилось позже, что при работе со сборкой через reflection в...</description></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#">performance</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">cache</category><title>False sharing</title><link>http://www.handcode.ru/2010/11/false-sharing.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>5</thr:total><description>Казалось бы, зачем задумывываться о процессах, происходящих на таком низком уровне, как кэширование данных в L1 и L2 кешах (L1, L2 cache), если Вы программируете под .NET. Очевидно для повышения быстродействия программы (perfomance) за счет уменьшения кэш-промахов (Cache Miss). Самый простой и классический пример демонстрирующий проблему Cache Miss, это  "неправильный" обход массива. При "правильном" обходе количество промахов будет минимально, следовательно участок кода выполнится быстрее:



int size =...</description></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#">Log</category><category domain="http://www.blogger.com/atom/ns#">Config</category><title>Настройка логов на примере NLog</title><link>http://www.handcode.ru/2010/10/nlog.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>0</thr:total><description>Хочу поделиться с Вами своим best practices по настройке логирования на примере NLog. Логи, это первая вещь, которую приходится настраивать при создании нового проекта, причем обычно для каждого нового проекта настройки логирования выглядят, как шаблонное решение, поэтому разумно выделить единый общий шаблон и использовать его в своих проектах. В данной статье рассмотрим мое простое шаблонное решение, которое я успешно применяю во многих своих проектах. Основная идея которую я отразил в шаблоне, это...</description></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><link>http://www.handcode.ru/2010/10/stopwatch.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>7</thr:total><description>Во время работы приложения, в качестве мониторинга времени выполнения метода или доступа к свойству используется класс Stopwatch из System.Diagnostics. Работает Stopwatch очень просто, он замеряет время прошедшее между вызовами Start* и Stop* методами. Приведу простой пример:



// &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;.Stopwatch timer = new Stopwatch();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer.Start(); //...</description></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><link>http://www.handcode.ru/2010/09/equals.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>10</thr:total><description>Работая с объектами, нам часто явно или неявно приходится их сравнивать их друг с другом. За сравнение объектов отвечает метод Equals или его типизированная версия из IEquatable, возвращающая true в случае если объекты равны, в противном случае false. Стандартная реализация метода Equals не всегда удовлетворяет потребностям разработчика, так как она не учитывает конкретных особенностей объекта, и в этом случае, реализация конкретного Equals/IEquatable ложится на плечи самого разработчика. Каждый...</description></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><link>http://www.handcode.ru/2010/08/enum-xml-api.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>8</thr:total><description>Проектируя публичное API очень важно понимать, что Ваше API будут использовать другие разработчики различного уровня, которые будут вынуждены разбираться в нем с нуля. Именно поэтому важную роль здесь играет простота и понятность созданного Вами API. Интуитивно-понятное API намного проще осваивать, и тем более использовать. Любое API подразумевает обмен сообщениями между "клиентом" и "сервером", и зачастую такие сообщения удобно записывать в виде XML. Стандартная ситуация, Вы формируете некий XML и...</description></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><link>http://www.handcode.ru/2010/08/marker-interface-custom-attributes.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>10</thr:total><description>Бывают случаи, когда у разработчика C# возникает острая необходимость пометить некую сущность маркером (Marker), и в зависимости от типа маркера соответственно обрабатывать сущность. Например, Вы получаете сообщения, и для различных типов сообщений (но не для всех, а например только для типа MessageB) делаете запись в лог о их получении (например, в методе OnReceive(Message msg)):



class Message{}class MessageA : Message { }class MessageB : Message { }class MessageC : Message { }



Существуют несколько...</description></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#">ThreadSafe</category><category domain="http://www.blogger.com/atom/ns#">Queueing</category><title>NQueueing - Система Массового Обслуживания</title><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>20</thr:total><description>Хочу представить Вам свою миниатюрную библиотеку (NQueueing), упрощающая C# .NET  разработчикам процесс разработки приложений, в которых присутствует  многопоточная обработка очередей (Система Массового Обслуживания (СМО)). Библиотеку NQueueing можно скачать с nqueueing.codeplex.com как в виде исходников, так и в виде готовой сборки.



Q: Зачем это?

A: Библиотека содержит расширяемый набор классов и интерфейсов, представляющих для .NET разработчика простой инструмент для реализации собственной СМО.



Q:...</description></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><link>http://www.handcode.ru/2010/07/c-idisposable.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>30</thr:total><description>Наверняка Вы сталкивались с ситуацией, когда Вам требуется совершить явный вызов метода Dispose у объекта, реализующего интерфейс IDisposable, при этом, для каждого такого Dispose-вызова приходиться постоянно писать одинаковый код, по следующему шаблону (проверка на null, вызов IDisposable.Dispose):



// &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;if (some != null){&amp;nbsp;&amp;nbsp;&amp;nbsp; some.Dispose();}



Раз...</description></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><link>http://www.handcode.ru/2010/06/using-null-object.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>9</thr:total><description>Интересное поведение наблюдается, если в блоке using используется нулевой объект: using(null){...}. Казалось бы, очевидно, у нас должно возникнуть исключение NullReferenceException при попытке вызвать метод Dispose нулевого объекта (null object), как только мы выйдем за пределы блока using:



using ((IDisposable)null){}// &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;.// &amp;#1052;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;...</description></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><link>http://www.handcode.ru/2010/06/enum.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>14</thr:total><description>Иногда, бывает очень удобно возвращать результат работы сервис-метода в качестве Enum значения. Представим ситуацию: Вы пишите сервис-метод, который возвращает два возможных состояния true/false (область значений), как бы Вы поступили, ограничились бы стандартным типом Bool или все-таки ввели бы новый Enum? Идея оставить Bool не совсем удачна, если вдруг придется расширить область значений сервис-метода. Например, в задаче аутентификации пользователя, где помимо информации об удаче/неудаче необходимо...</description></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#">XSD</category><category domain="http://www.blogger.com/atom/ns#">XML</category><title>XML elements или XML attributes</title><link>http://www.handcode.ru/2010/05/xml-elements-xml-attributes.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>2</thr:total><description>Всегда проектируя структуру XML файла, Вы наверняка задумывались, где хранить данные: в атрибуте (XML attribute) или все-таки в узле (XML element). Это довольно важный вопрос, который нужно решить раз и навсегда еще на этапе проектирования XSD схемы, иначе последующее переделывание XSD схемы не есть хорошая практика. Обратите внимание на два XML файла:



&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&amp;lt;!-- &amp;#1061;&amp;#1088;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1084;...</description></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><link>http://www.handcode.ru/2010/05/thread-safe-events.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>9</thr:total><description>Если Вы пишите многопоточное приложение, то всегда стоит задумываться о потоко-безопасности (thread safe). Сегодня затронем важную тему про то, как правильно возбуждать событие (event raise), доступ к которому осуществляется в нескольких потоках. 



class SomeClass{&amp;nbsp;&amp;nbsp;&amp;nbsp; // &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;...</description></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4651372785022826505</guid><pubDate>Tue, 11 May 2010 15:33:00 +0000</pubDate><atom:updated>2010-05-11T15:36:56.730+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><title>Совместное использование Repository с Unit Of Work.</title><link>http://www.handcode.ru/2010/05/repository-unit-of-work.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>16</thr:total><description>В этом посте я решил поделиться мыслями о том, как можно применить паттерн Repository совместно с паттерном Unit Of Work (UOW). Рассмотрим это на конкретном примере. Для этого введем две сущности: Customer и Order, состоящим в отношении один-ко-многим соответственно. 



Разумеется, все CRUD действия над сущностями будут производиться в классах репозитариях, не содержащих Save/Commit методов:



// &amp;#1050;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;...</description></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-3124589205973473089</guid><pubDate>Tue, 04 May 2010 19:18:00 +0000</pubDate><atom:updated>2010-05-04T19:32:03.769+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">Best Practices</category><title>Domain-Driven Design: создание домена</title><link>http://www.handcode.ru/2010/05/domain-driven-design.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>44</thr:total><description>На днях прочитал полезную статью от Александра Бындю Domain-Driven Design: создание домена, подумав, я решил поделиться своим мнением и рассказать о том, как обычно разворачиваю домены в своих проектах, в частности рассказать о том, как для этого можно задействовать Entity Framework.



Во-первых, если Вы имеете дело с доменными объектами, то старайтесь всегда выделять базовые (общие) свойства.



// &amp;#1054;&amp;#1073;&amp;#1097;&amp;#1080;&amp;#1081; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1074;&amp;#1089;&amp;#1077;&amp;#1093;...</description></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-4469651026489999523</guid><pubDate>Thu, 29 Apr 2010 16:13:00 +0000</pubDate><atom:updated>2011-01-20T12:10:43.173+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">IoC/DI</category><category domain="http://www.blogger.com/atom/ns#">Hello</category><title>Hello, Unity 2.0</title><link>http://www.handcode.ru/2010/04/hello-unity-20.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>16</thr:total><description>Рассматривая ранее принцип инверсии зависимости, мы остановились на том, что нам нужен некий IoC/DI фреймворк, который помог бы нам избавиться от рутинной работы. Как я уже говорил, существуем множество различных IoC/DI фреймворков:

Microsoft Unity
Ninject
Autofac
StructureMap
Castle
Spring.Net
В этой статье мы познакомимся с open-source IoC/DI контейнером от Microsoft Unity 2.0 под .NET 4.0. Работать с данным фреймворком очень легко, и я продемонстрирую это Вам на простом примере, проделав простых 5...</description></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5422036137568788209.post-1672803744957871361</guid><pubDate>Mon, 26 Apr 2010 15:23:00 +0000</pubDate><atom:updated>2010-08-12T13:28:19.135+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Fluent interface</category><category domain="http://www.blogger.com/atom/ns#">Builder</category><title>Используем Fluent Builder</title><link>http://www.handcode.ru/2010/04/fluent-builder.html</link><author>noreply@blogger.com (Илья Дубаденко)</author><thr:total>11</thr:total><description>Продолжая тему Fluent interface, решил написать про Fluent builder. Основная цель Fluent builder - упростить процесс конструирования объектов, используя для этого цепочки методов (set-методы). 



Разберемся на простом примере, для этого рассмотрим сущность, описываемую классом Post:



partial class Post{&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Title { get; set; }&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Author { get; set; }&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime PublishedAt { get; set; }&amp;nbsp;&amp;nbsp;&amp;nbsp; public...</description></item></channel></rss>

