<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>edren-baton</title>
	<atom:link href="http://edren.fatal.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://edren.fatal.ru</link>
	<description>Вариант номер три</description>
	<pubDate>Sat, 14 Aug 2010 19:48:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Очередная порция меня на YouTube</title>
		<link>http://edren.fatal.ru/archives/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d0%bf%d0%be%d1%80%d1%86%d0%b8%d1%8f-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%bd%d0%b0-youtube/</link>
		<comments>http://edren.fatal.ru/archives/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d0%bf%d0%be%d1%80%d1%86%d0%b8%d1%8f-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%bd%d0%b0-youtube/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 19:48:00 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[guitar]]></category>

		<category><![CDATA[music]]></category>

		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=289</guid>
		<description><![CDATA[Выложил на YouTube еще 4 гитарных видео:

Романс о романсе. О нем речь уже шла вот тут.

Joy of Bossa Nova чешского композитора Jiří Jirmal. Эту же композицию видел под названием Shiny Day. Здесь можно посмотреть и послушать, как ее играет автор.


Nuages Джанго Рейнхардта. Рекомендую также к просмотру в исполнении Rosenberg Trio.


Suite Azure, часть 2: Danza. Это [...]]]></description>
			<content:encoded><![CDATA[<p>Выложил на YouTube еще 4 гитарных видео:</p>
<ol>
<li><a href="http://www.youtube.com/watch?v=jr3EedNNlBs"><b>Романс о романсе</b></a>. О нем речь уже шла <a href="/archives/%D1%80%D0%BE%D0%BC%D0%B0%D0%BD%D1%81-%D0%BE-%D1%80%D0%BE%D0%BC%D0%B0%D0%BD%D1%81%D0%B5-%D0%BD%D0%BE%D1%82%D1%8B-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%8B/">вот тут</a>.
</li>
<li><a href="http://www.youtube.com/watch?v=BLRI5vowShA"><b>Joy of Bossa Nova</b></a> чешского композитора <a href="http://en.wikipedia.org/wiki/Ji%C5%99%C3%AD_Jirmal">Jiří Jirmal</a>. Эту же композицию видел под названием Shiny Day. <a href="http://www.youtube.com/watch?v=uriGkKRp5zo">Здесь</a> можно посмотреть и послушать, как ее играет автор.
</li>
<li>
<a href="http://www.youtube.com/watch?v=B3y_yW4YFqs"><b>Nuages</b></a> <a href="http://ru.wikipedia.org/wiki/%D0%94%D0%B6%D0%B0%D0%BD%D0%B3%D0%BE_%D0%A0%D0%B5%D0%B9%D0%BD%D1%85%D0%B0%D1%80%D0%B4%D1%82">Джанго Рейнхардта</a>. Рекомендую также к просмотру <a href="http://www.youtube.com/watch?v=U7UHmKfUAu8">в исполнении Rosenberg Trio</a>.
</li>
<li>
<a href="http://www.youtube.com/watch?v=fCgCqNW8a70"><b>Suite Azure, часть 2: Danza</b></a>. Это еще одна композиция by Jiří Jirmal.
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d0%bf%d0%be%d1%80%d1%86%d0%b8%d1%8f-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%bd%d0%b0-youtube/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Чему поучиться у ExtJS</title>
		<link>http://edren.fatal.ru/archives/%d1%87%d0%b5%d0%bc%d1%83-%d0%bf%d0%be%d1%83%d1%87%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d1%83-extjs/</link>
		<comments>http://edren.fatal.ru/archives/%d1%87%d0%b5%d0%bc%d1%83-%d0%bf%d0%be%d1%83%d1%87%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d1%83-extjs/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 09:52:50 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[extjs]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[sencha]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=287</guid>
		<description><![CDATA[Вступление
Вчера меня снова потянуло на ExtJS. Видимо, жарища так влияет. Поковырявшись в интернете, я нашел черновую версию книги ExtJS in Action, загрузил ее в свой Sony Reader и стал читать. После прочтения трех первых глав пришло осознание того, насколько красиво там сделаны некоторые базовые вещи. В этой статейке я остановлюсь на двух моментах.

1. Config-объекты и [...]]]></description>
			<content:encoded><![CDATA[<h3>Вступление</h3>
<p>Вчера меня снова потянуло на <a href="http://www.sencha.com/">ExtJS</a>. Видимо, жарища так влияет. Поковырявшись в интернете, я нашел черновую версию книги <a href="http://narod.ru/disk/18951914000/Ext_JS_in_Action_-_Jesus_D._Garcia__Jr..rar.html">ExtJS in Action</a>, загрузил ее в свой Sony Reader и стал читать. После прочтения трех первых глав пришло осознание того, насколько красиво там сделаны некоторые базовые вещи. В этой статейке я остановлюсь на двух моментах.<br />
<span id="more-287"></span></p>
<h3>1. Config-объекты и xtypes</h3>
<p>В ExtJS, если существует компонент, например, <code>MyComponent</code>, то у него обязательно есть родственник <code>MyComponentConfig</code>. Последний содержит все настройки компонента. И возможны два случая.</p>
<p>Либо он передается в конструктор <code>MyComponent</code>-у, и экземпляр <code>MyCompoment</code> создается немедленно. В этом случае такой объект называется <em>config object</em>.</p>
<p>Либо он содержится в коллекции элементов (родительского) контейнера.  Тогда контейнер создаст компонент на основе конфигурации, когда в этом будет необходимость. В этом случае <code>MyComponentConfig</code> называют <em>xtype</em>. </p>
<p>Так как ExtJS - это Javascript библиотека, а Javascript - язык с нестрогой типизацией, то <code>MyComponentConfig</code> как такового нету. Вместо него используются Javascript plain objects с полем <code>xtype</code>.</p>
<p>Рассмотрим пример. Мы хотим создать textbox. Вот его настройки:</p>
<pre><code class="javascript">var fieldConfig = {
    xtype: 'textfield',
    fieldLabel: 'Your name',
    value: 'test'
};
</code></pre>
<p>Теперь можно создать textbox явно:</p>
<pre><code class="javascript">var field = new Ext.form.TextField(fieldConfig);
field.render(document.body);
</code></pre>
<p>А можно создать форму с текстбоксом вот так:</p>
<pre><code class="javascript">var form = new Ext.form.FormPanel({
    items: [ fieldConfig ]
});
form.render(document.body);
</code></pre>
<p>Во втором случае есть контейнер (<code>FormPanel</code>), и конфигурация текстбокса находится в коллекции <code>items</code>. Как видно, текстбокс никто не создает - его создаст контейнер.</p>
<p>Вроде бы ничего особенного, но смотрите, что дает нам эта схема:</p>
<h4>a) Возможность комбинировать компоненты без каких либо ограничений</h4>
<p>Опишу ситуацию на примере, который недавно наблюдал на работе. Допустим вы разработали некий <code>BlazingFastControl</code>. Он достаточно навороченный, у него 100 опций по управлению наворотами:</p>
<div style="text-align: center">
    <img src="/storage/blazing.png" />
</div>
<p>Прошло время. Надо развивать продукт, и вы решили написать вот такое:</p>
<div style="text-align: center">
    <img src="/storage/blazing-popup.png" />
</div>
<p>Объединив <code>BlazingFastControl</code> и <code>MegaDropDown</code>, хотите получить некий <code>BlazingFastLookup</code>. </p>
<p>Но вот беда: надо дать пользователю возможность как-то настраивать внутренний компонент. И если настройки не были изолированы в отдельный объект <code>BlazingFastConfig</code>, то придется дублировать все 100 опций и писать глупый код по их копированию. Особенное зло ждет в .NET, где каждая property обычно обвешана десятком атрибутов.</p>
<h4>b) Config-driven component assembly</h4>
<p>По-русски это значит, что config-объекты - это готовый способ сериализации UI. То есть весь интерфейс или его куски можно описывать и хранить в JSON или в другом формате. </p>
<p>Вы скажете мол ничего удивительного - ASP.NET контролы тоже можно объявлять в разметке. Но есть нюанс:</p>
<h4>c) Отложенное создание вложенных компонентов</h4>
<p>Представьте себе следующий UI: tab-panel в тремя вкладками, и за каждой вкладкой скрывается целый мир компонентов. </p>
<p>Если это описать в виде config-объектов, то после запуска не будет нужды создавать тяжелые экземпляры всех компонентов. Достаточно будет создать только то, что видно на активной вкладке. А на остальные, может быть, никто и не переключится, и 2/3 компонентов не будут даже создаваться, а так и останутся в зачаточном состоянии. Это - большая экономия ресурсов!</p>
<p>Почитать еще можно <a href="http://stackoverflow.com/questions/2317728/extjs-what-is-xtype-good-for">на stackoverflow</a>.</p>
<h3>2. Layouts</h3>
<p>В ExtJS есть контейнеры (Container), которые содержат элементы (items). То, как элементы будут отображаться внутри контейнера, диктует специальный объект <em>Layout</em>.</p>
<p>Объясню на абстрактном примере. Объявим контейнер и элемент так:</p>
<pre><code class="cs">class Container {
    public Collection&lt;IItem&gt; Items { get; }
    public ILayout Layout { get;  }
}

interface IItem {
    string Text { get; }
}</code></pre>
<p>Допустим, наше приложение имеет дело с документами:</p>
<pre><code class="cs">class MyDocument : IItem {
    public string Title { get; set; }
    public string Content { get; set; }
    // ...
    string IItem.Text { get { return Title; } }
}
</code></pre>
<p>Можно создать <code>Container</code>, заполнить его <code>MyDocument</code>-ами. И с помощью разных реализаций <code>ILayout</code> получить меню, табы, nav bar, форму или что-то свое невообразимое.</p>
<h3>Заключение</h3>
<p>ExtJS демонстрирует удачное применение паттернов проектирования для обеспечения повторного использования, оптимизации и кастомизации. Если вы пишете компоненты, и еще не поздно принимать архитектурные решения, обратите внимание на описанные тут подходы!</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/%d1%87%d0%b5%d0%bc%d1%83-%d0%bf%d0%be%d1%83%d1%87%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d1%83-extjs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Должен ли &#8220;плюс&#8221; быть коммутативной операцией?</title>
		<link>http://edren.fatal.ru/archives/%d0%b4%d0%be%d0%bb%d0%b6%d0%b5%d0%bd-%d0%bb%d0%b8-%d0%bf%d0%bb%d1%8e%d1%81-%d0%b1%d1%8b%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bc%d1%83%d1%82%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%bc/</link>
		<comments>http://edren.fatal.ru/archives/%d0%b4%d0%be%d0%bb%d0%b6%d0%b5%d0%bd-%d0%bb%d0%b8-%d0%bf%d0%bb%d1%8e%d1%81-%d0%b1%d1%8b%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bc%d1%83%d1%82%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%bc/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 07:49:28 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=286</guid>
		<description><![CDATA[Недавно посмотрел видеозапись выступления А. Степанова в Яндексе. В своей лекции он мечтает о том, что когда-то все алгоритмы будут объединены в некий центральный каталог, и никто не будет изобретать велосипеды в своих программах. Спору нет, идея отличная, хотя и утопия.
Но чтобы (говорит мэтр) такой каталог был возможен, надо, чтобы каждая операция (сложение там, умножение&#8230;) [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно посмотрел <a href="http://video.yandex.ru/users/ya-events/view/126/?cauthor=ya-events&#038;cid=10">видеозапись выступления</a> А. Степанова в Яндексе. В своей лекции он мечтает о том, что когда-то все алгоритмы будут объединены в некий центральный каталог, и никто не будет изобретать велосипеды в своих программах. Спору нет, идея отличная, хотя и утопия.</p>
<p>Но чтобы (говорит мэтр) такой каталог был возможен, надо, чтобы каждая операция (сложение там, умножение&#8230;) имела четко определенную семантику. И один из спорных моментов касается операции &#8220;плюс&#8221;. Степанов хвастается, что ни разу в жизни нигде не сделал ни одного не-коммутативного плюса. Плюс должен быть коммутативен, точка. Действительно, перестановочному закону учили еще в первом классе школы: &#8220;при перестановке слагаемых сумма не меняется&#8221;, <code style="white-space: nowrap">a + b = b + a</code>. </p>
<p>Очевидно, что <code>"сложение" + "строк"</code> немедленно оказывается за рамками всей этой красоты. И подписка на события в C# (<code>obj.Changed += myFunc</code>) тоже. Получается, что Perl и PHP молодцы, потому что складывают строки <code style="white-space: nowrap">$вот . $так</code>, а другие языки нарушают свойства <a href="http://ru.wikipedia.org/wiki/%D0%90%D0%B1%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0">абелевых групп</a>, и их разработчикам должно быть стыдно. </p>
<p>Но правильно ли все это? Действительно ли коммутативность должна быть главным свойством сложения? </p>
<p>Для обычного человека (в том числе и для <a href="http://lurkmore.ru/%D0%91%D1%8B%D0%B4%D0%BB%D0%BE%D0%BA%D0%BE%D0%B4%D0%B5%D1%80">рядового программиста</a>, который и слышать не слышал ни о каких абелевых группах) основное свойство сложения, интуитивно понятное, заключается в том, что в результате что-то объединяется. Было у Леши 2 яблока, а у Сережи 3 - сложили и получили 5. К ста рублям прибавили 200 и получили 300. Было две строки - сложили и получили одну длинную. Был обработчик события - прибавили к нему еще один и получили составной обработчик.</p>
<p>Так что, несомненно, А. Степанов крутой чел, но при всем уважении позвольте закончить статью <a href="http://lurkmore.ru/C++#STL">вот этой ссылкой</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/%d0%b4%d0%be%d0%bb%d0%b6%d0%b5%d0%bd-%d0%bb%d0%b8-%d0%bf%d0%bb%d1%8e%d1%81-%d0%b1%d1%8b%d1%82%d1%8c-%d0%ba%d0%be%d0%bc%d0%bc%d1%83%d1%82%d0%b0%d1%82%d0%b8%d0%b2%d0%bd%d1%8b%d0%bc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC - как использовать вместе с WebForms</title>
		<link>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%b5-%d1%81-webforms/</link>
		<comments>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%b5-%d1%81-webforms/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 19:15:39 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[asp.net mvc]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=283</guid>
		<description><![CDATA[Все-таки нельзя сказать бескомпромиссно, что ASP.NET MVC - это круто, а ASP.NET WebForms - полный сакс. Сильные и слабые стороны есть как у первой, так и у второй технологии.
Вполне логично иметь публичную часть веб-проекта на MVC, организованную по всем канонам семантической верстки и accessibility (как, например, stackoverflow.com), а внутренний админский интерфейс, состоящий преимущественно из скучного [...]]]></description>
			<content:encoded><![CDATA[<p>Все-таки нельзя сказать бескомпромиссно, что ASP.NET MVC - это круто, а ASP.NET WebForms - полный сакс. Сильные и слабые стороны есть как у первой, так и у второй технологии.</p>
<p>Вполне логично иметь публичную часть веб-проекта на MVC, организованную по всем канонам семантической верстки и accessibility (как, например, <a href="http://stackoverflow.com/">stackoverflow.com</a>), а внутренний админский интерфейс, состоящий преимущественно из скучного <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a>-а, сделать на WebForms с использованием облегчающих жизнь компонентов вроде <a href="http://demos.devexpress.com/ASPxGridViewDemos/MasterDetail/MasterDetail.aspx">ASPxGridView</a> и <a href="http://demos.devexpress.com/ASPxTreeListDemos/Editing/Modes.aspx">ASPxTreeList</a>.<br />
<span id="more-283"></span><br />
Две технологии уживаются вместе без каких-либо проблем, но я хотел бы сделать акцент на использовании MVC именно в Web Site. </p>
<p>Не является секретом, что ASP.NET-проекты бывают двух типов: Web Site и Web Application. Они различаются способом организации проекта и моделью компиляции. Подробнее можно узнать в <a href="http://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx#wapp_topic5">первоисточнике</a>. </p>
<p>Мне больше нравятся проекты типа Web Site. Во-первых, потому что для просмотра отдельной страницы не надо собирать весь сайт, который может быть большим и долго компилироваться. Во-вторых, сама идея компиляции по запросу мне представляется более естественной для веба. Да, есть и недостатки, но я от них ни разу не страдал. Думаю, что для малых и средних сайтов Web Site - самое оно. Как говорится, сайт он и есть сайт.</p>
<p>Сегодня студия имеет шаблон только для ASP.NET MVC Web Application, но запустить MVC в контексте Web Site совсем не сложно. Достаточно проделать нижеследующие шаги:</p>
<ol>
<li>Запустите студию, как минимум 2008-ю и создайте новый Web Site по шаблону Empty Web Site. Не забудьте выбрать язык C#, а то вам могут впарить бейсик по-дефолту
<div>&nbsp;</div>
</li>
<li>Добавьте ссылки на сборки: <code>System.Web.Abstractions</code>, <code>System.Web.Mvc</code>, <code>System.Web.Routing</code>. ASP.NET MVC должен быть либо установлен в вашей системе, либо у вас просто должна быть где-то под рукой эта сборка. После махинации, в сайте появится файл web.config
<div>&nbsp;</div>
</li>
<li>В секцию <code>pages</code> файла web.config для своего же удобства добавьте строки
<pre><code lang="xml">&lt;namespaces&gt;
    &lt;add namespace=&quot;System.Web.Mvc&quot;/&gt;
    &lt;add namespace=&quot;System.Web.Mvc.Ajax&quot;/&gt;
    &lt;add namespace=&quot;System.Web.Mvc.Html&quot; /&gt;
    &lt;add namespace=&quot;System.Web.Routing&quot;/&gt;
    &lt;add namespace=&quot;System.Linq&quot;/&gt;
    &lt;add namespace=&quot;System.Collections.Generic&quot;/&gt;
&lt;/namespaces&gt;</code></pre>
<div>&nbsp;</div>
</li>
<li>Теперь заставьте работать routing. Для этого в web.config нужно добавить:
<pre><code lang="xml">&lt;system.web&gt;
    ...
    &lt;httpModules&gt;
        ...
        &lt;add name=&quot;UrlRoutingModule&quot; type=&quot;System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;/&gt;
    &lt;/httpModules&gt;
&lt;/system.web&gt;
...
&lt;system.webServer&gt;
    &lt;modules runAllManagedModulesForAllRequests=&quot;true&quot;&gt;
        ...
        &lt;add name=&quot;UrlRoutingModule&quot; type=&quot;System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;/&gt;
    &lt;/modules&gt;
    &lt;handlers&gt;
        ...
        &lt;add name=&quot;UrlRoutingHandler&quot; preCondition=&quot;integratedMode&quot; verb=&quot;*&quot; path=&quot;UrlRouting.axd&quot; type=&quot;System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;/&gt;
    &lt;/handlers&gt;
&lt;/system.webServer&gt;</code></pre>
<p>Видно, что регистрируется Routing-модуль для Classic и Integrated режимов, устанавливается параметр <code>runAllManagedModulesForAllRequests</code>, чтобы модули запускались даже тех путей, которые сервер не нашел на диске. Я не понял, зачем нужен еще Handler для integrated-режима (последний <code>add</code>), но без него не работает.</p>
<p>Хочу сказать, что эти настройки я придумал не сам, а подглядел в web.config из проекта Dynamic Data Web Site, который является одним из примеров использования роутинга в WebForms.</p>
<div>&nbsp;</div>
</li>
<li>Добавьте в сайт класс App следующего вида:
<pre><code lang="C#">using System.Web.Mvc;
using System.Web.Routing;

public static class App {

    public static void RegisterRoutes() {
        var r = RouteTable.Routes;
        r.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);
        r.IgnoreRoute(&quot;{resource}.aspx/{*pathInfo}&quot;);
        r.MapRoute(
            &quot;Default&quot;,
            &quot;{controller}/{action}/{id}&quot;,
            new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }
        );
    }

}</code></pre>
<p>Бьюсь об заклад, что вы догадались, зачем это нужно. Тут вы будете регистрировать маршруты и держать разные другие настройки вашего приложения.</p>
<div>&nbsp;</div>
</li>
<li>Добавьте в сайт файл Global.asax (Global Application Class), и на Application_Start позовите RegisterRoutes:
<pre><code lang="xml">&lt;%@ Application Language=&quot;C#&quot; %&gt;

&lt;script runat=&quot;server&quot;&gt;

    void Application_Start(object sender, EventArgs e) {
        App.RegisterRoutes();
    }

&lt;/script&gt;</code></pre>
<div>&nbsp;</div>
</li>
<li>Добавьте в сайт папку Views и внутрь положите вот такой web.config:
<pre><code lang="xml">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;configuration&gt;
  &lt;system.web&gt;
    &lt;httpHandlers&gt;
      &lt;add path=&quot;*&quot; verb=&quot;*&quot;
          type=&quot;System.Web.HttpNotFoundHandler&quot;/&gt;
    &lt;/httpHandlers&gt;
    &lt;pages
        validateRequest=&quot;false&quot;
        pageParserFilterType=&quot;System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;
        pageBaseType=&quot;System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;
        userControlBaseType=&quot;System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;&gt;
      &lt;controls&gt;
        &lt;add assembly=&quot;System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot; namespace=&quot;System.Web.Mvc&quot; tagPrefix=&quot;mvc&quot; /&gt;
      &lt;/controls&gt;
    &lt;/pages&gt;
  &lt;/system.web&gt;

  &lt;system.webServer&gt;
    &lt;validation validateIntegratedModeConfiguration=&quot;false&quot;/&gt;
    &lt;handlers&gt;
      &lt;remove name=&quot;BlockViewHandler&quot;/&gt;
      &lt;add name=&quot;BlockViewHandler&quot; path=&quot;*&quot; verb=&quot;*&quot; preCondition=&quot;integratedMode&quot; type=&quot;System.Web.HttpNotFoundHandler&quot;/&gt;
    &lt;/handlers&gt;
  &lt;/system.webServer&gt;
&lt;/configuration&gt;</code></pre>
<p>Можно убедиться, что такой же web.config есть в любом проекте ASP.NET MVC. По большому счету, он содержит разного рода затычки.</p>
<div>&nbsp;</div>
</li>
<li>Tada! Конфигурационный гемор окончен. Можно делать контроллеры и вьюхи почти так же, как и в MVC web application, сделанном по шаблону. Конечно, есть определенные неудобства. Например, нету удобных диалогов Add Controller и Add View. Я с этим готов мириться - я быстро печатаю.</li>
</ol>
<p>Отдельные вопросы - это куда класть контроллеры и модели. Я сторонник тонких контроллеров и толстых моделей (не поймите неправильно, речь идет о <a href="http://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a>). Поэтому модель я бы выносил в отдельную сборку с красивым названием вроде <code>MyMegaSite.Domain</code>. А контроллеры либо тоже в отдельную сборку (но это только для фанатов тестирования всего на свете), либо банально в App_Code - они же тонкие.</p>
<p>В заключение, должен отметить, что в ASP.NET MVC Web Application классические aspx-страницы можно использовать без каких-либо дополнительных телодвижений. Цель статьи - рассказать, как пользоваться MVC в проектах типа Web Site. Если вам нравятся Web Applications, то вы счастливый человек - у вас все out of the box.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%b5-%d1%81-webforms/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Castle ActiveRecord - какая красота!</title>
		<link>http://edren.fatal.ru/archives/castle-activerecord-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d0%ba%d1%80%d0%b0%d1%81%d0%be%d1%82%d0%b0/</link>
		<comments>http://edren.fatal.ru/archives/castle-activerecord-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d0%ba%d1%80%d0%b0%d1%81%d0%be%d1%82%d0%b0/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 11:11:32 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[activerecord]]></category>

		<category><![CDATA[c#]]></category>

		<category><![CDATA[castle]]></category>

		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=281</guid>
		<description><![CDATA[В последнее время я все гляжу в сторону Castle Project. Наконец, дошли руки поиграться с ActiveRecord.
Говорят, что термин ActiveRecord придумал вездесущий Фаулер. Этот паттерн используется в Ruby on Rails и в других MVC-каркасах. Подробности можно поискать в гугле.
Castle Project предлагает на безвозмездной основе реализацию ActiveRecord, которая вызвала у меня восторг.

Чтобы попытаться придти в такой же [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время я все гляжу в сторону <a href="http://www.castleproject.org/">Castle Project</a>. Наконец, дошли руки поиграться с ActiveRecord.</p>
<p>Говорят, что термин ActiveRecord придумал вездесущий Фаулер. Этот паттерн используется в Ruby on Rails и в других MVC-каркасах. Подробности можно поискать в гугле.</p>
<p>Castle Project предлагает на безвозмездной основе реализацию ActiveRecord, которая вызвала у меня восторг.<br />
<span id="more-281"></span><br />
Чтобы попытаться придти в такой же восторг, попробуйте такое:</p>
<ol>
<li><a href="http://www.castleproject.org/castle/download.html">Скачайте</a> ActiveRecord и распакуйте куда вам удобно</li>
<li>Создайте Console Application в VS 2008 и добавьте ссылки на сборки:
<p>Castle.ActiveRecord <br />
Castle.ActiveRecord.Linq <br />
Castle.Core <br />
NHibernate <br />
NHibernate.ByteCode.Castle <br />
NHibernate.Linq <br />
System.Data.SQLite </p>
</li>
<li>В Program.cs поместите такой код:</li>
</ol>
<pre><code lang="c#">// A domain object:

[ActiveRecord]
public class Developer : ActiveRecordLinqBase&lt;Developer&gt; {

    [PrimaryKey]
    public int ID { get; private set; }

    [Property]
    public string Name { get; set; }

    [Property]
    public double CoffePerDay { get; set; }

}

// An app:

class Program {
    static void Main(string[] args) {

        // Configuring NHibernate
        // I wish Fluent NHibernate worked with ActiveRecord
        // But unfortunately in general it doesn't:
        // http://stackoverflow.com/questions/1915454/using-castle-activerecord-with-fluent-nhibernate/1918929#1918929

        var props = new Dictionary&lt;string, string&gt;() {
            { &quot;connection.driver_class&quot;, typeof(NHibernate.Driver.SQLite20Driver).AssemblyQualifiedName },
            { &quot;dialect&quot;, typeof(NHibernate.Dialect.SQLiteDialect).AssemblyQualifiedName },
            { &quot;connection.provider&quot;, typeof(NHibernate.Connection.DriverConnectionProvider).AssemblyQualifiedName },
            { &quot;connection.connection_string&quot;, &quot;Data Source=c:/test.db&quot; },
            { &quot;proxyfactory.factory_class&quot;, typeof(NHibernate.ByteCode.Castle.ProxyFactoryFactory).AssemblyQualifiedName },
            { &quot;show_sql&quot;, &quot;true&quot;}
        };

        // Initializing ActiveRecord

        var source = new InPlaceConfigurationSource();
        source.Add(typeof(ActiveRecordBase), props);
        ActiveRecordStarter.Initialize(Assembly.GetExecutingAssembly(), source);
        ActiveRecordStarter.UpdateSchema();

        // Application logic:

        if(Developer.Queryable.Count() &lt; 1) {
            using(new SessionScope()) {
                new Developer() { Name = &quot;Lexa&quot;, CoffePerDay = 0.1 }.Create();
                new Developer() { Name = &quot;SergeS&quot;, CoffePerDay = 1.5 }.Create();
                new Developer() { Name = &quot;Ramon&quot;, CoffePerDay = 0 }.Create();
                new Developer() { Name = &quot;Beresta&quot;, CoffePerDay = 1 }.Create();
            }
        }

        var report = from i in Developer.Queryable
                     orderby i.CoffePerDay
                     where i.CoffePerDay &gt; 0
                     select new { Name = i.Name };

        foreach(var item in report)
            Console.WriteLine(item);

        Console.ReadKey();
    }
}</code></pre>
<p>После первого запуска в консоль будет выведено:</p>
<pre>NHibernate: SELECT count(*) as y0_ FROM Developer this_
NHibernate: INSERT INTO Developer (Name, CoffePerDay) VALUES (@p0, @p1); select last_insert_rowid();@p0 = 'Lexa', @p1 = 0,1
NHibernate: INSERT INTO Developer (Name, CoffePerDay) VALUES (@p0, @p1); select last_insert_rowid();@p0 = 'SergeS', @p1 = 1,5
NHibernate: INSERT INTO Developer (Name, CoffePerDay) VALUES (@p0, @p1); select last_insert_rowid();@p0 = 'Ramon', @p1 = 0
NHibernate: INSERT INTO Developer (Name, CoffePerDay) VALUES (@p0, @p1); select last_insert_rowid();@p0 = 'Beresta', @p1 = 1
NHibernate: SELECT this_.Name as y0_ FROM Developer this_ WHERE this_.CoffePerDay > @p0 ORDER BY this_.CoffePerDay asc;@p0 = 0
{ Name = Lexa }
{ Name = Beresta }
{ Name = SergeS }</pre>
<p>Выводится это потому, что в настройках присутствовал параметр show_sql.</p>
<p>Видно, что:</p>
<ul>
<li>Проектирование идет от объектов</li>
<li>Работа ведется с объектами</li>
<li>Не нужно никаких маппингов</li>
<li>Для хранения можно использовать любую базу из тех, что поддерживает NHibernate</li>
<li>LINQ работает!</li>
</ul>
<p>Wow I like it.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/castle-activerecord-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d0%ba%d1%80%d0%b0%d1%81%d0%be%d1%82%d0%b0/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Нелегкой судьбы Many-to-many relationship</title>
		<link>http://edren.fatal.ru/archives/%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%b5-%d0%ba%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%bc/</link>
		<comments>http://edren.fatal.ru/archives/%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%b5-%d0%ba%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%bc/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 18:41:17 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=279</guid>
		<description><![CDATA[Сначала слово предоставим капитану Очевидность. 

Many-to-many (сообщает нам капитан)  - это когда есть два объекта/факта/сущности, и при этом первый знает о нескольких других, а каждый другой - о нескольких первых.


Сразу несколько примеров из окружающего мира:



Первый пример я всегда привожу в пример, потому что он был для меня исторически первым. Он описывает дискографию артиста, который [...]]]></description>
			<content:encoded><![CDATA[<p>Сначала слово предоставим <a href="http://absurdopedia.wikia.com/wiki/%D0%9A%D0%B0%D0%BF%D0%B8%D1%82%D0%B0%D0%BD_%D0%9E%D1%87%D0%B5%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%8C">капитану Очевидность</a>. </p>
<blockquote><p>
Many-to-many (сообщает нам капитан)  - это когда есть два объекта/факта/сущности, и при этом первый знает о нескольких других, а каждый другой - о нескольких первых.
</p></blockquote>
<p><span id="more-279"></span><br />
Сразу несколько примеров из окружающего мира:</p>
<div style="text-align: center">
<img src="/storage/many-to-many-1.gif" alt="ER диаграммы с примерами many-to-many связей" />
</div>
<p>Первый пример я всегда привожу в пример, потому что он был для меня исторически первым. Он описывает дискографию артиста, который выпустил кроме сольников много сборников, и таким образом одна песня может встречаться на двух или трех пластинках. </p>
<p>Второй пример избит чуть меньше чем hello world. Есть товары, есть заказы, и заказ состоит из списка товаров.</p>
<p>Третий пример из области контроля доступа. Пользователям назначаются роли, чтобы дать разные полномочия в какой-то системе (например на сайте).</p>
<p>Все три примера представлены в виде ER-диаграмм, на которых как известно зависимость многие-ко-многим нельзя сделать, не вводя дополнительной сущности (которую еще называют junction table). Дополнительная сущность находится по центру и пока никак не названа.</p>
<p>В то же время в мире объектов many-to-many реализуется легко - каждый из объектов содержит в себе коллекцию объектов-партнеров:</p>
<div style="text-align: center">
<img src="/storage/many-to-many-2.gif" alt="Пример классов со связью many-to-many" />
</div>
<p>Так выглядит первый пример с точки зрения объектной модели. Заказ имеет вполне естественную коллекцию товаров. А у товара есть не очень естественная коллекция заказов, в которых он встречается. </p>
<p>Но с такой двусторонней связью работать не так уж и приятно - при добавлении товара в коллекцию к заказу надо позаботиться о том, чтобы заказ попал в коллекцию к товару, а тут несложно и stack overflow схлопотать. С двусторонними связями вообще работать неудобно, а с many-to-many в особенности, но это отдельная тема.</p>
<p>Еще один нюанс заключается в том, что часто связь нагружена подробностями. Например, в случае песен и пластинок имеет значение порядок композиции в треклисте. Товары в заказе также упорядочены. А привязанная к пользователю роль может иметь дату истечения действия или даже критический для системы атрибут - разрешение это или запрет. </p>
<p>Свою мысль я веду к тому, что связующие сущности не надо прятать. Им почти всегда можно придумать красивые названия. В первом моем примере, ее можно назвать Позиция Треклиста, во втором примере - Позиция Накладной, в третьем - Правило Доступа.</p>
<p>У этого есть и другие преимущества. Облегчается OR-mapping, потому что дырка между миром таблиц и миром объектов исчезает. Упрощается создание CRUD-интерфейсов: чтобы показать накладную, надо просто отфильтровать все Позиции Накладной по определенному заказу.</p>
<div style="text-align: center">
<img src="/storage/many-to-many-3.gif" alt="many-to-many с именами и нагрузкой" />
</div>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%b5-%d0%ba%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%b8%d0%bc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC - Sharp View Engine</title>
		<link>http://edren.fatal.ru/archives/asp-net-mvc-sharp-view-engine/</link>
		<comments>http://edren.fatal.ru/archives/asp-net-mvc-sharp-view-engine/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 19:45:07 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[asp.net mvc]]></category>

		<category><![CDATA[sharp view engine]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=278</guid>
		<description><![CDATA[Хотел преподнести как первоапрельскую шутку, а потом пригляделся и увидел, что задумка-то на самом деле весьма неплоха:
Прошу любить и жаловать:
http://code.google.com/p/sharp-view-engine/
Это View Engine, в котором вся вьюха пишется на языке C# с помощью using-блоков  
]]></description>
			<content:encoded><![CDATA[<p>Хотел преподнести как первоапрельскую шутку, а потом пригляделся и увидел, что задумка-то на самом деле весьма неплоха:</p>
<p>Прошу любить и жаловать:<br />
<a href="http://code.google.com/p/sharp-view-engine/">http://code.google.com/p/sharp-view-engine/</a></p>
<p>Это View Engine, в котором вся вьюха пишется на языке C# с помощью using-блоков <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/asp-net-mvc-sharp-view-engine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC - как вынести часть приложения в отдельную сборку?</title>
		<link>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d1%8c%d1%8e%d1%85%d0%b8-%d0%b2-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b5/</link>
		<comments>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d1%8c%d1%8e%d1%85%d0%b8-%d0%b2-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b5/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 13:37:23 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[asp.net mvc]]></category>

		<category><![CDATA[spark]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=277</guid>
		<description><![CDATA[В этот раз я расскажу, как иметь часть контроллеров и вьюшек в отдельной сборке.
Зачем?
Чтобы обеспечить их повторное использование. К примеру, в бытность мою PHP-шником я имел небольшой проект, который генерировал добротную CRUD-админку по xml-описанию. И я просто ссылался через svn:externals на нее в каждом моем проекте. 
В ASP.NET MVC было бы правильнее добавлять ссылку на [...]]]></description>
			<content:encoded><![CDATA[<p>В этот раз я расскажу, как иметь часть контроллеров и вьюшек в отдельной сборке.</p>
<h3>Зачем?</h3>
<p>Чтобы обеспечить их повторное использование. К примеру, в бытность мою PHP-шником я имел небольшой проект, который генерировал добротную CRUD-админку по xml-описанию. И я просто ссылался через svn:externals на нее в каждом моем проекте. </p>
<p>В ASP.NET MVC было бы правильнее добавлять ссылку на скомпилированную DLL, нежели на файлы и папки.</p>
<h3>Какие трудности?</h3>
<p>Оказалось, что в ASP.NET MVC 2 это сделать не так-то просто. Если с контроллерами проблем не возникает, ибо они обычные классы, то с views все сильно сложнее.<br />
<span id="more-277"></span><br />
В preview-релизах у них была затея под названием <a href="http://habrahabr.ru/blogs/net/74061/">Area Subprojects</a> (ахтунг, ссылка на хабр!), но в релизе они ее <a href="http://forums.asp.net/p/1516088/3629558.aspx">свели на нет</a>, оставив только Areas в пределах одного проекта. Позор и срам!</p>
<p>Интернеты предлагают разные решения: <a href="http://stackoverflow.com/questions/236972/using-virtualpathprovider-to-load-asp-net-mvc-views-from-dlls">регистацию своего VirtualPathProvider-а</a>, который не работает в Medium Trust, <a href="http://stackoverflow.com/questions/670685/can-asp-net-mvc-views-aspx-be-reused-in-multiple-asp-net-mvc-projects/670695#670695">написание наследника ViewResult</a>, который будет выдирать aspx-файлы из embedded ресурсов и компилировать их на лету (каждый раз?)</p>
<p>Что первый, что второй вариант выглядят мерзко. </p>
<h3>Я буду использовать <a href="http://sparkviewengine.com/">Spark View Engine</a></h3>
<ul>
<li>Он имеет более приятный синтаксис, чем месиво из процентных ASP-тегов</li>
<li>Он имеет встроенную функциональность по загрузке вьюх из embedded-ресурсов</li>
<li>Он позволяет полностью избавиться от WebForms в ASP.NET MVC</li>
</ul>
<p>Говорят, что в нем даже работает intellisense, но не могу это подтвердить, потому что у меня под рукой только Visual Web Developer 2008, который не допускает плагинов. Справедливости ради, надо заметить, что от aspx и ascx файлов, помещенных в class library, тоже никакого вменяемого intellisense не дождешься. Прямо какое-то &#8220;use your favourite text editor&#8221; получается&#8230;</p>
<h3>Демонстрация по шагам</h3>
<p>Для начала, убедитесь, что у вас установлен ASP.NET MVC 2. Установить его легче всего через <a href="http://www.microsoft.com/web/downloads/platform.aspx">Web platform installer</a>.</p>
<p>Теперь запустите студию 2008. Создайте проект &#8220;ASP.NET MVC 2 Empty Web Application&#8221;. Убедитесь, что создаете C#-проект (а то я постоянно это упускаю из внимания и создаю проекты на козлином бейсике). Проект назовите <code>TestProject.Main</code>. </p>
<p>Добавьте в solution еще один проект (File | Add | New Project) типа Class Library под названием <code>TestProject.Part</code>. В него добавьте ссылку на <code>System.Web.Mvc</code>. А на него добавьте ссылку в <code>TestProject.Main</code>. Надеюсь, вы еще не запутались.</p>
<p>Скачайте Spark. Это надо сделать в разделе Downloads на <a href="http://sparkviewengine.codeplex.com/">http://sparkviewengine.codeplex.com/</a>. </p>
<p>В проект <code>TestProject.Main</code> добавьте ссылки на <code>Spark.dll</code> и <code>Spark.Web.Mvc.dll</code>.</p>
<p>В <code>Global.asax</code> в метод <code>Application_Start</code> надо прописать минимальную конфигурацию спарка:</p>
<pre><code lang="c#">var settings = new SparkSettings();
ViewEngines.Engines.Add(new SparkViewFactory(settings));</code></pre>
<p>После этого в качестве вьюх будут находиться не только <code>*.aspx</code> и <code>*.ascx, но</code> и <code>*.spark</code>.</p>
<p>Итак, подготовка закончена. Начнем добавлять контроллеры и вьюхи в <code>TestProject.Part</code>. Создайте в проекте папку <code>Controllers</code>, а в ней класс <code>TestController</code>, унаследованный от <code>Controller</code>. Напишите один action-метод <code>TestAction</code>:</p>
<pre><code lang="C#">namespace TestProject.Part.Controllers {

    public class TestController : Controller {

        public ActionResult TestAction() {
            return View();
        }

    }

}</code></pre>
<p>Теперь в <code>Global.asax</code> в методе <code>RegisterRoutes</code> зарегистрируем маршрут, который будет направлять посетителей на этот контроллер:</p>
<pre><code lang="C#">public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);

    routes.MapRoute(
        &quot;EdrenRoute&quot;,
        &quot;edren&quot;,
        new { controller = &quot;Test&quot;, action = &quot;TestAction&quot; },
        new[] { &quot;TestProject.Part.Controllers&quot; }
    );

}</code></pre>
<p>Этот код значит, что по запросу <code>edren</code> управление будет передано методу <code>TestAction</code> класса <code>TestController</code>, который будет искаться в пространстве имен <code>TestProject.Part.Controllers</code>.</p>
<p>Не забудьте <strong>стереть или закомментировать Default route</strong>! Иначе он будет конфликтовать с нашим. </p>
<p>Теперь можно запустить проект <code>TestProject.Main</code>, перейти на адрес <code>http://localhost:NNNN/edren</code> и получить ошибку &#8220;The view &#8216;TestAction&#8217; or its master was not found.&#8221;</p>
<p>Подобрались вплотную к развязке. В проект <code>TestProject.Part</code> добавляем файл <code>Views/Test/TestAction.spark</code>. Вообще, студия про spark-файлы ничего не знает, поэтому можно добавить xml и поменять ему расширение. Файлу надо обязательно задать <code>Build Action</code> в <code>Embedded Resource</code>. Внутрь напишите:</p>
<pre><code lang="xml">&lt;h1&gt;Hello, it's ${DateTime.Now}&lt;/h1&gt;</code></pre>
<p>А в <code>Global.asax</code> осталось добавить несколько строк, чтобы Spark искал вьюхи в нужном нам месте:</p>
<pre><code lang="C#">var settings = new SparkSettings();

settings.AddNamespace(&quot;System&quot;);
settings.AddViewFolder(ViewFolderType.EmbeddedResource, new Dictionary&lt;string, string&gt;()
{
    { &quot;assembly&quot;, &quot;TestProject.Part&quot; },
    { &quot;resourcePath&quot;, &quot;TestProject.Part.Views&quot; }
});</code></pre>
<p>Видно, что я поведал спарку о том, что хочу использовать в шаблонах пространство имен <code>System</code> (чтобы <code>DateTime.Now</code> сумело скомпилироваться) и указал местоположение шаблонов - в сборке <code>TestProject.Part</code> по пути <code>TestProject.Part.Views</code>.</p>
<p>Все! Теперь, если запустить страницу, которая раньше ругалась на отсутствие вьюхи, мы увидим приветствие и узнаем, сколько сейчас времени. А узнав, сколько сейчас времени, решим для себя, что на сегодня хватит высоких материй <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/asp-net-mvc-%d0%b2%d1%8c%d1%8e%d1%85%d0%b8-%d0%b2-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Мысли по поводу ASP.NET MVC</title>
		<link>http://edren.fatal.ru/archives/asp-net-mvc/</link>
		<comments>http://edren.fatal.ru/archives/asp-net-mvc/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 21:13:00 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[asp.net mvc]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=275</guid>
		<description><![CDATA[Я не буду как попугай повторять про separation of concerns, testability и agile development. Я согласен, что это все здорово. Я хочу рассказать о том, чем (на мой взгляд) ASP.NET MVC выгодно отличается от MVC-фреймворков на других платформах:

В ASP.NET MVC не надо запускать консольных тулзов и править конфиги на языке YAML в &#8220;вашем любимом текстовом [...]]]></description>
			<content:encoded><![CDATA[<p>Я не буду как попугай повторять про separation of concerns, testability и agile development. Я согласен, что это все здорово. Я хочу рассказать о том, чем (на мой взгляд) ASP.NET MVC выгодно отличается от MVC-фреймворков на других платформах:</p>
<ul>
<li>В ASP.NET MVC не надо запускать консольных тулзов и править конфиги на языке YAML в &#8220;вашем любимом текстовом редакторе&#8221;
<div>&nbsp;</div>
</li>
<li>Для ASP.NET MVC есть отличная среда разработки под названием Visual Studio (которая даже бывает бесплатной, в Express-версии)
<div>&nbsp;</div>
</li>
<li>Из предыдущего пункта вытекает, что у вас будет хороший отладчик и запускалка тестов вроде TestDriven.NET, а может быть даже CodeRush!
<div>&nbsp;</div>
</li>
<li>В ASP.NET MVC вы будете писать код на C#, у вас будет на вооружении LINQ и весь .NET
<div>&nbsp;</div>
</li>
</ul>
<p>Звучит убедительно? Или может быть вам больше нравится стиль разработки, показанный <a href="http://www.symfony-project.org/screencast/admin-generator">в этом скринкасте</a>? <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/asp-net-mvc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Романс о романсе - ноты для одной гитары</title>
		<link>http://edren.fatal.ru/archives/%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81-%d0%be-%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81%d0%b5-%d0%bd%d0%be%d1%82%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%b3%d0%b8%d1%82%d0%b0%d1%80%d1%8b/</link>
		<comments>http://edren.fatal.ru/archives/%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81-%d0%be-%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81%d0%b5-%d0%bd%d0%be%d1%82%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%b3%d0%b8%d1%82%d0%b0%d1%80%d1%8b/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 13:11:57 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[guitar]]></category>

		<category><![CDATA[midi]]></category>

		<category><![CDATA[music]]></category>

		<category><![CDATA[ноты]]></category>

		<category><![CDATA[романс]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=271</guid>
		<description><![CDATA[Сделал переложение для одной гитары песни из фильма &#8220;Жестокий романс&#8221; (оригинал можно послушать тут).
Как обычно, предлагаю для скачивания во всех возможных форматах:

Таблатура в формате Guitar Pro 5
Ноты в виде PDF файла
MIDI

Если вы оказались в сложной ситуации - если у вас нет Guitar Pro, PDF не открывается, а от звука MIDI вы впадаете в уныние, то [...]]]></description>
			<content:encoded><![CDATA[<p>Сделал переложение для одной гитары песни из фильма &#8220;Жестокий романс&#8221; (оригинал можно <a href="http://www.kinoplay.narod.ru/music/Jest_Romans/Jest_Romans_1.mp3">послушать тут</a>).</p>
<p>Как обычно, предлагаю для скачивания во всех возможных форматах:</p>
<ul>
<li><a href="/storage/romans-o-romanse-guitar.gp5">Таблатура в формате Guitar Pro 5</a></li>
<li><a href="/storage/romans-o-romanse-guitar.pdf">Ноты в виде PDF файла</a></li>
<li><a href="/storage/romans-o-romanse-guitar.mid">MIDI</a></li>
</ul>
<p>Если вы оказались в сложной ситуации - если у вас нет Guitar Pro, PDF не открывается, а от звука MIDI вы впадаете в уныние, то можете просто <a href="/storage/romans-o-romanse-guitar.mp3.zip">послушать</a> как это примерно должно звучать.</p>
<p>Переложение я делал под себя. То есть, мне более-менее удобно это играть. Если кому-то еще пригодится, я буду рад.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81-%d0%be-%d1%80%d0%be%d0%bc%d0%b0%d0%bd%d1%81%d0%b5-%d0%bd%d0%be%d1%82%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%b3%d0%b8%d1%82%d0%b0%d1%80%d1%8b/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
