<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Adrian Alonso</title><link>http://weblogs.asp.net/adalon/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AdrianAlonso" /><feedburner:info uri="adrianalonso" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>How-to get the XML representacion of a DSL Model Element</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/Re7Zw13UAsM/how-to-get-the-xml-representacion-of-a-dsl-model-element.aspx</link><pubDate>Sun, 20 Apr 2008 15:59:07 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6115562</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=6115562</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2008/04/20/how-to-get-the-xml-representacion-of-a-dsl-model-element.aspx#comments</comments><description>&lt;p&gt;Today I had to find out how to get the XML representacion of a DSL Model Element. Here you have an extension method for Model Elements (mels)&amp;nbsp;that gets the concrete serializer using the Domain XML Serializer Directory and the Domain Class Id of the target Model Element (mel).&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetXML(&lt;span class="kwrd"&gt;this&lt;/span&gt; ModelElement mel)
        {
            StringBuilder xml = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();
            
            DomainXmlSerializerDirectory directory = &lt;span class="kwrd"&gt;new&lt;/span&gt; DomainXmlSerializerDirectory();
            directory.AddBehavior(CoreDesignSurfaceSerializationBehavior.Instance);
            directory.AddBehavior(&amp;lt;#Yours DSL Serialization Behavior goes here #&amp;gt;.Instance);
            // Gets the serializer of the Mel&lt;/pre&gt;&lt;pre class="csharpcode"&gt;            DomainClassXmlSerializer serializer = directory.GetSerializer(mel.GetDomainClass().Id);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (serializer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                &lt;span class="kwrd"&gt;using&lt;/span&gt; (XmlWriter writer = XmlWriter.Create(&lt;span class="kwrd"&gt;new&lt;/span&gt; StringWriter(xml)))
                {
                    serializer.Write(&lt;span class="kwrd"&gt;new&lt;/span&gt; SerializationContext(directory), mel, writer);
                }
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                Trace.TraceWarning(Resources.UnableToGetSerializer, mel.GetType().Name);
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; xml.ToString();
        }
&lt;/pre&gt;&lt;pre class="csharpcode"&gt;HTH,&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Adrian&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6115562" width="1" height="1"&gt;</description><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2008/04/20/how-to-get-the-xml-representacion-of-a-dsl-model-element.aspx</feedburner:origLink></item><item><title>Clarius T4 Editor is out!</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/A_PiBgdxqzU/clarius-t4-editor-is-out.aspx</link><pubDate>Thu, 18 Oct 2007 11:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4622252</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=4622252</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/10/18/clarius-t4-editor-is-out.aspx#comments</comments><description>&lt;p&gt;The beta version is available at &lt;a href="http://www.t4editor.net" title="http://www.t4editor.net" mce_href="http://www.t4editor.net"&gt;http://www.t4editor.net&lt;/a&gt;. You can go, download it and provide some feedback at the &lt;a href="http://forums.clariusconsulting.net/viewforum.php?f=9" mce_href="http://forums.clariusconsulting.net/viewforum.php?f=9"&gt;Clarius T4 Forum&lt;/a&gt;&amp;nbsp;which will be very valuable for us (Clarius) to prioritize the most important features for the RTM version!&lt;/p&gt; &lt;p&gt;&lt;img src="http://weblogs.asp.net/blogs/adalon/t4editor-banner.JPG" mce_src="http://weblogs.asp.net/blogs/adalon/t4editor-banner.JPG"&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here is you have the&amp;nbsp; links:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.clariusconsulting.net/blogs/vga/archive/2007/10/18/35477.aspx" mce_href="http://www.clariusconsulting.net/blogs/vga/archive/2007/10/18/35477.aspx"&gt;Victor's officil announcement&lt;/a&gt; &lt;br&gt;&lt;a href="http://www.t4editor.net" mce_href="http://www.t4editor.net"&gt;Clarius T4 Editor Site&lt;/a&gt;&lt;br&gt;&lt;a href="http://forums.clariusconsulting.net/viewforum.php?f=9" mce_href="http://forums.clariusconsulting.net/viewforum.php?f=9"&gt;Clarius T4 Editor Forums&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.t4editor.net/downloads.html" mce_href="http://www.t4editor.net/downloads.html"&gt;Clarius T4 Editor Download&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thanks!&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4622252" width="1" height="1"&gt;</description><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/10/18/clarius-t4-editor-is-out.aspx</feedburner:origLink></item><item><title>Clarius is Hiring!</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/nKiczbemnK0/clarius-is-hiring.aspx</link><pubDate>Wed, 17 Oct 2007 15:47:02 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4607196</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=4607196</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/10/17/clarius-is-hiring.aspx#comments</comments><description>&lt;p&gt;As &lt;a href="http://weblogs.asp.net/cibrax/"&gt;Pablo&lt;/a&gt; said in his &lt;a href="http://weblogs.asp.net/cibrax/archive/2007/10/17/clarius-is-hiring.aspx"&gt;post&lt;/a&gt; &lt;a href="http://www.clariusconsulting.net"&gt;Clarius&lt;/a&gt; is looking for candidates to fill Senior Dev Positions. You can check the details in &lt;a href="http://weblogs.asp.net/cibrax/archive/2007/10/17/clarius-is-hiring.aspx"&gt;Pablo's post&lt;/a&gt; too and if you are interested you can ping &lt;a href="http://weblogs.asp.net/cibrax/"&gt;Pablo&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/adalon/contact.aspx"&gt;me&lt;/a&gt; (alo&amp;nbsp;AT clariusconsulting&amp;nbsp;DOT net or through the &lt;a href="http://weblogs.asp.net/adalon/contact.aspx"&gt;contact form&lt;/a&gt; of this blog) or send your&amp;nbsp;resume directly to Clarius job alias (which you can find in &lt;a href="http://www.clariusconsulting.net"&gt;www.clariusconsulting.net&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Thanks!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4607196" width="1" height="1"&gt;</description><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/10/17/clarius-is-hiring.aspx</feedburner:origLink></item><item><title>runas cmd makes your life easier</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/oplntM--Lgs/runas-cmd-makes-your-life-easier.aspx</link><pubDate>Thu, 27 Sep 2007 18:37:36 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4217094</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=4217094</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/09/27/runas-cmd-makes-your-life-easier.aspx#comments</comments><description>&lt;p&gt;This week I had to temporaly&amp;nbsp;use a different user on my machine. So at first I thought I had to move all my settings (outlook profile, firefox bookmarks, vms, etc)&amp;nbsp;from my primary user to this new one. This is not a nice task. Hopefully I remembered the &lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true"&gt;runas&lt;/a&gt; command which allowed me to run the above programs (indeed I'm currently creating this post&amp;nbsp;running WLW&amp;nbsp;using&amp;nbsp;runas)&amp;nbsp;as my primary user from the new user&amp;nbsp;session. IMO this is definitily a very good tip if you have the same scenario in the feature.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4217094" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/09/27/runas-cmd-makes-your-life-easier.aspx</feedburner:origLink></item><item><title>Read source code to be a better developer</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/3k_pf4AwXfA/read-source-code-to-be-a-better-developer.aspx</link><pubDate>Wed, 26 Sep 2007 14:37:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4177304</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=4177304</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/09/26/read-source-code-to-be-a-better-developer.aspx#comments</comments><description>&lt;p&gt;I want to give it a try.&amp;nbsp;My idea is to take a look at one or two projects every week and post some conclusions of what I could learn of them. Here you have for example&amp;nbsp;the latest&amp;nbsp;&lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode6.aspx" mce_href="http://www.hanselman.com/blog/TheWeeklySourceCode6.aspx"&gt;Scott Hanselman's post&lt;/a&gt; showing his weekly results.&amp;nbsp;&amp;nbsp;So if you have in mind a really cool source code stuff, please&amp;nbsp;feel free to&amp;nbsp;ping me (leaving a comment to this post or using the contact me link) and let me know where I can get it!&amp;nbsp; Thanks!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4177304" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Personal/default.aspx">Personal</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Java/default.aspx">Java</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/09/26/read-source-code-to-be-a-better-developer.aspx</feedburner:origLink></item><item><title>Adding a custom VS Task List Token</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/Gt9mV9YVJQ4/adding-a-custom-vs-task-list-token.aspx</link><pubDate>Tue, 11 Sep 2007 14:44:21 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3826291</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3826291</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/09/11/adding-a-custom-vs-task-list-token.aspx#comments</comments><description>&lt;p&gt;You probably used the TODO task list token to add a comment about what it should be done. But what about if you want to use a custom token to add a different kind of comment; for example a Review(x) comment. VS allows you to add custom task list token via Tools-&amp;gt;Options-&amp;gt;Environment-&amp;gt;Task List as it's shown in the following screenshot:&lt;/p&gt; &lt;p&gt;&lt;img src="http://weblogs.asp.net/blogs/adalon/tasklisttokens01.JPG"&gt; &lt;/p&gt; &lt;p&gt;So then you will able to add the Review comments and&amp;nbsp;these will be appearing in the Task List comments section:&lt;/p&gt; &lt;p&gt;&lt;img src="http://weblogs.asp.net/blogs/adalon/tasklisttokens02.JPG"&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3826291" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/C_2300_/default.aspx">C#</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/09/11/adding-a-custom-vs-task-list-token.aspx</feedburner:origLink></item><item><title>TCI - Toolbox Controls Installer</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/gL0M0F8WxjA/tci-toolbox-controls-installer.aspx</link><pubDate>Fri, 07 Sep 2007 17:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780964</guid><dc:creator>adalon</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780964</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/09/07/tci-toolbox-controls-installer.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;TCI is a VS Package that is provided by the VS SDK as a redist. TCI allows you to easily add&amp;nbsp;your custom&amp;nbsp;Control to the VS Toolbox. For a brief introduction to TCI you can check the VS SDK documentation. Here I will try to cover what is happening under cover:  &lt;/p&gt;&lt;p&gt;When you want to add your custom control to the VS toolbox using the TCI VS Package all you need is to tell TCI where the assembly containing the control is and&amp;nbsp;notify&amp;nbsp;to TCI this event incrementing a registry key.&amp;nbsp;Probably the easier way to achieve these requirements is using a WIX-based installer (as the SDK sample does).  &lt;/p&gt;&lt;p&gt;In order to tell TCI where your control is&amp;nbsp;you can&amp;nbsp;use the&amp;nbsp;the fully qualified type name if you are installing the control in the GAC as following:  &lt;/p&gt;&lt;p&gt;&amp;lt;Registry Root="HKLM" Key="Software\Microsoft\VisualStudio\9.0\ToolboxControlsInstaller\GacControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1631b3e7a8fbcce5, processorArchitecture=MSIL" Value="Litware Controls" Type="string" /&amp;gt;  &lt;/p&gt;&lt;p&gt;Or provide a location where the assembly containing the control&amp;nbsp;is using the CodeBase value:  &lt;/p&gt;&lt;p&gt;&amp;lt;Registry Root="HKLM" Key="Software\Microsoft\VisualStudio\9.0\ToolboxControlsInstaller\NonGacControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1631b3e7a8fbcce5, processorArchitecture=MSIL" Value="Litware Controls" Type="string"&amp;gt;&lt;br&gt;&amp;lt;Registry Name="Codebase" Value="[#AssemblyContainingTheFile.dll]" Type="string" /&amp;gt;&lt;br&gt;&amp;lt;/Registry&amp;gt;  &lt;/p&gt;&lt;p&gt;Finally you have to include the MSM containing the custom actions which notify TCI that a new Control has been installed:  &lt;/p&gt;&lt;p&gt;&amp;lt;Merge Id="TbxCtrlsInstDefaultItemsCA" Language="1033" SourceFile="..\..\..\Redistributables\TbxCtrlsInstDefaultItemsCA.msm" DiskId="1" /&amp;gt;  &lt;/p&gt;&lt;p&gt;The custom action will increment or decrement the&amp;nbsp;"Default Items" value of the&amp;nbsp;following registry entry:  &lt;/p&gt;&lt;p&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{2c298b35-07da-45f1-96a3-be55d91c8d7a}\Toolbox]&lt;br&gt;"Default Items"=dword:00000001  &lt;/p&gt;&lt;p&gt;Note that&amp;nbsp;the&amp;nbsp;{2c298b35-07da-45f1-96a3-be55d91c8d7a} is the GUID for the TCI VS Package.  &lt;/p&gt;&lt;p&gt;It's important to check if the TCI Redist is already installed before installing your custom controls if you targeting VS 2500. It's not necessary for VS codename "Orcas" because&amp;nbsp;TCI Package is already installed. You can find the TCI VS Package in the VS's Private Assemblies directory.&amp;nbsp;  &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780964" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/adalon/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/WIX/default.aspx">WIX</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/09/07/tci-toolbox-controls-installer.aspx</feedburner:origLink></item><item><title>Why a good error message is important</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/J7KT_2b5tfk/why-a-good-error-message-is-important.aspx</link><pubDate>Mon, 27 Aug 2007 17:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780528</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780528</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/08/27/why-a-good-error-message-is-important.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I was trying to change my private email in one of the forums I'm subscripted. The thing is that after clicking the save button it said:&lt;/p&gt; &lt;p&gt;&lt;em&gt;"Sorry, an Error has Occurred"&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;"Unfortunately an error has occurred during the processing of your page request. If&amp;nbsp;you were attempting to submit a new post, your post may not have been recorded. Please accept our apologies for the inconvenience."&lt;/em&gt;&lt;/p&gt; &lt;p&gt;And some links to go back, help, etc.&amp;nbsp;No helpful at all. I searched through the forum posts to find out if someone had has the same issue and I found that the private email address&amp;nbsp;couldn't be duplicated. In that moment I remembered I had another user with that address so I could take the steps to be able to change&amp;nbsp;it in a few seconds. If the error message had been something like "The email address is being used by another user. Please choose a different mail and try again" it would be a significant save of time. &lt;/p&gt; &lt;p&gt;The cause of the error is probably&amp;nbsp;due to&amp;nbsp;they are not&amp;nbsp;validating the email address, so after receiving the generic sql error they show the generic (not useful at all) "Sorry, and Error has Occurred".&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780528" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/08/27/why-a-good-error-message-is-important.aspx</feedburner:origLink></item><item><title>"Organize Usings" in VS code name "Orcas" ala Eclipse</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/PwMLZTg76Mc/quot-organize-usings-quot-in-vs-code-name-quot-orcas-quot-ala-eclipse.aspx</link><pubDate>Thu, 16 Aug 2007 00:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780529</guid><dc:creator>adalon</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780529</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/08/15/quot-organize-usings-quot-in-vs-code-name-quot-orcas-quot-ala-eclipse.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Those that have used Eclipse will probably miss the ctrl+shift+o shortcut ("Organize Imports") when you switch to VS. But now VS code name "Orcas"&amp;nbsp;provides a "new" feature (which&amp;nbsp;unofficially existed in Whidbey)&amp;nbsp;that allows you to remove and sort usings:&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog-adrianalonso.certant.com/blog/sortandremove01.JPG"&gt; &lt;/p&gt; &lt;p&gt;So if you don't want miss the Eclipse feature anymore you can add the shortcut going to Tools-&amp;gt;Options-&amp;gt;Environment-&amp;gt;Keyboard&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog-adrianalonso.certant.com/blog/sortandremove02.JPG"&gt; &lt;/p&gt; &lt;p&gt;Search the RemoveAndSort command and press the ctrl+shift+o combination. Note that the shorcut is&amp;nbsp;currently used by the OpenProject command and it will lost if&amp;nbsp;you&amp;nbsp;confirm to use the combination&amp;nbsp;for the RemoveAndSort command.&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780529" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Refactoring/default.aspx">Refactoring</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/08/15/quot-organize-usings-quot-in-vs-code-name-quot-orcas-quot-ala-eclipse.aspx</feedburner:origLink></item><item><title>GAX 1.3 is out!</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/y_lCQgO0y-c/gax-1-3-is-out.aspx</link><pubDate>Mon, 06 Aug 2007 01:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780530</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780530</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/08/05/gax-1-3-is-out.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This new version of GAX is a must if you are thinking to develop Guidance Packages&amp;nbsp;using&amp;nbsp;VS Codename "Orcas" (previous version of GAX didn't work&amp;nbsp;with the latest version of VS) and it will also provide some new features if your are developing with VS 2005.&lt;/p&gt; &lt;p&gt;A&amp;nbsp;welcomed “fix” is the&amp;nbsp;enhancement of the&amp;nbsp;registration process. Now it's&amp;nbsp;smarter&amp;nbsp;about&amp;nbsp;whether to install VB templates&amp;nbsp;based on the presence of VB as a Visual Studio's product.&amp;nbsp;This means that&amp;nbsp;if your Guidance Package contains VB templates (.vstemplates for VB projects or items) you won't need to&amp;nbsp;add conditional logic in your installer to avoid the registration failure when the package is being installed or registered.  &lt;p&gt;The GAX installer is also improved to use WIX technology but&amp;nbsp;the GAT installer project that is unfolded when you create a new Guidance Package using GAT is still the same VS Setup Project.  &lt;p&gt;At last, the Experimental Hive registration is now a built-in feature in GAX allowing you to register your Guidance Packages in both Normal and Experimental hives.  &lt;p&gt;So it seems that this CTP is a&amp;nbsp;necessary and welcomed&amp;nbsp;update&amp;nbsp;for the runtime but not for the UX of developing Guidance Packages.  &lt;p&gt;Here you have the links:  &lt;p&gt;- &lt;a href="http://blogs.msdn.com/agile/archive/2007/08/02/new-gax-gat-july-2007-released.aspx"&gt;Grigory Melnik's announcement&lt;/a&gt;&lt;br&gt;- &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C0A394C0-5EEB-47C4-9F7B-71E51866A7ED&amp;amp;displaylang=en"&gt;GAX July 2007 CTP download&lt;/a&gt;&lt;br&gt;- &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E3D101DB-6EE1-4EC5-884E-97B27E49EAAE&amp;amp;displaylang=en"&gt;GAT July 2007 CTP&amp;nbsp;download&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780530" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/GAX/default.aspx">GAX</category><category domain="http://weblogs.asp.net/adalon/archive/tags/GAT/default.aspx">GAT</category><category domain="http://weblogs.asp.net/adalon/archive/tags/WIX/default.aspx">WIX</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/08/05/gax-1-3-is-out.aspx</feedburner:origLink></item><item><title>Microsoft Volta</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/zryficIwCBU/microsoft-volta.aspx</link><pubDate>Wed, 01 Aug 2007 21:51:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780531</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780531</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/08/01/microsoft-volta.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;What&amp;nbsp;Microsoft Volta is? Take a look at these videos in &lt;a href="http://channel9.msdn.com/"&gt;channel 9&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1. &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=324060"&gt;Eirk Meijer: Volta - Wrapping the Cloud with .NET - Part 1&lt;/a&gt;&lt;br&gt;2. &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=324699"&gt;Eirk Meijer: Volta - Wrapping the Cloud with .NET - Part 2&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;From the video introduction:&lt;/p&gt; &lt;p&gt;&lt;em&gt;"Volta is an evolving research project focused on exploring ways to innovate data-intensive programming models. Volta is currently exploring a lean-programming inspired toolkit for building web-based and mobile applications by stretching the .NET programming model to cover the Cloud. &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Volta is exploring innovation that empowers programmers to delay decisions about tier-splitting to the last possible responsible moment by using either code refactoring or declarative annotations. "&lt;/em&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780531" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Volta/default.aspx">Volta</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/08/01/microsoft-volta.aspx</feedburner:origLink></item><item><title>SFT Setup Project: Deploying many Guidance Packages and many DSLs with a single MSI!</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/fBuh-0AOCtg/sft-setup-project-deploying-many-guidance-packages-and-many-dsls-with-a-single-msi.aspx</link><pubDate>Thu, 07 Jun 2007 12:27:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780532</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780532</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/06/07/sft-setup-project-deploying-many-guidance-packages-and-many-dsls-with-a-single-msi.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.softwarefactoriestoolkit.net/"&gt;Clarius SFT June CTP&lt;/a&gt;&amp;nbsp;is available. You can check &lt;a href="http://www.clariusconsulting.net/blogs/vga"&gt;Victor's blog&lt;/a&gt;&amp;nbsp;in order to get an overview of&amp;nbsp;the new features included in this drop. One of this new features is the capability of creating a Setup Project to generate a single MSI that installs many Guidance Packages and many DSLs. Let's take a look at how this feature works:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SFT Setup Project Feature:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This new feature allows you to create a new C# or VB wix-based&amp;nbsp;project selecting which Guidance Packages or DSLs you want to include in your&amp;nbsp;MSI. After running the wizard you will get a single project&amp;nbsp;whose output&amp;nbsp;will be&amp;nbsp;a single MSI.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Here is an example:&lt;/em&gt;&lt;/p&gt; &lt;p&gt;1. In this sample we have a&amp;nbsp;solution that contains the following projects: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;a. A class diagram DSL project&lt;br&gt;b.&amp;nbsp;A minimal language DSL project&lt;br&gt;c.&amp;nbsp;A GAT-based Guidance Package&lt;br&gt;d. A SFT-based Guidance Package&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The SFT Setup Project wizard is launched adding a new project to the solution. You can select between C# and VB project types. &lt;/p&gt; &lt;p&gt;&lt;img src="http://blog-adrianalonso.certant.com/blog/sftsetupproject01.jpg"&gt; &lt;/p&gt; &lt;p&gt;2. The wizard is very simple. You just need to select the guidance packages and DSLs that will be included in the MSI and click finish.&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog-adrianalonso.certant.com/blog/sftsetupproject02.JPG"&gt; &lt;/p&gt; &lt;p&gt;3. Finally a new project will be added to the solution. At this point you should be able to build the project in order to get the MSI.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img src="http://blog-adrianalonso.certant.com/blog/sftsetupproject03.JPG"&gt; &lt;/p&gt; &lt;p&gt;Basically&amp;nbsp;you will find&amp;nbsp;3 groups of files in the SFT Setup Project:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1. Main Setup files&lt;br&gt;2. Guidance Packages files: Containg a few files by Guidance Package. You can take a look at my previous post&amp;nbsp;showing how&amp;nbsp;each Guidance Package setup is generated.&amp;nbsp;&lt;br&gt;3. DSLs files:&amp;nbsp;Each DSL setup is generated in the same way&amp;nbsp;as the DSL Setup Project provided by the DSL SDK does. We chose this implementation&amp;nbsp;because if you&amp;nbsp;already know how to customize the DSL Setup Project you won't need to expend time understanding this new feature of SFT!&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;(1)&amp;nbsp;Main Setup Files:&lt;br&gt;&lt;/strong&gt;&lt;strong&gt;SetupMetadata.items:&lt;/strong&gt; This is the file where you can customize the metadata for Guidance Packages, DSLs and define&amp;nbsp;the projects that will be built before&amp;nbsp;generating the MSI.&amp;nbsp;&lt;br&gt;&lt;strong&gt;Setup.wxs:&lt;/strong&gt; This is probably the most important file because it contains the setup product definition, the directory tree structure, the features (or the feature references), custom actions and the UI definition.&lt;br&gt;&lt;strong&gt;UI.wxs:&lt;/strong&gt; This contains the UI definition. This is probably the main file you will&amp;nbsp;need to customize to include your own branding.&lt;br&gt;&lt;strong&gt;Strings.wxl:&lt;/strong&gt; Wix localization stuff file.&lt;br&gt;&lt;strong&gt;License\License.rtf:&lt;/strong&gt; The license file&amp;nbsp;for your Guidance Package.&lt;br&gt;&lt;strong&gt;Bitmaps Folder:&lt;/strong&gt; Image files&amp;nbsp;for the installer wizard branding.&lt;/p&gt; &lt;p&gt;Where to&amp;nbsp;download SFT?&amp;nbsp;Follow this link! &amp;nbsp;&lt;a title="http://www.softwarefactoriestoolkit.net/" href="http://www.softwarefactoriestoolkit.net/"&gt;http://www.softwarefactoriestoolkit.net/&lt;/a&gt;&lt;br&gt;And please let us know your feedback about you want to include&amp;nbsp;or&amp;nbsp;improve in the next drops!&amp;nbsp;You can ping us&amp;nbsp;through the &lt;a href="http://www.guidanceautomation.net/cs/forums/"&gt;Guidance Automation Forum&lt;/a&gt; or directly to alo -AT- clariusconsulting -DOT- net.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780532" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/GAX/default.aspx">GAX</category><category domain="http://weblogs.asp.net/adalon/archive/tags/GAT/default.aspx">GAT</category><category domain="http://weblogs.asp.net/adalon/archive/tags/WIX/default.aspx">WIX</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Clarius/default.aspx">Clarius</category><category domain="http://weblogs.asp.net/adalon/archive/tags/DSL/default.aspx">DSL</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Clarius+SFT/default.aspx">Clarius SFT</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/06/07/sft-setup-project-deploying-many-guidance-packages-and-many-dsls-with-a-single-msi.aspx</feedburner:origLink></item><item><title>HowTo: Application Block Software Factory (ABSF) Part III: An example</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/DuR_UppZbMU/howto-application-block-software-factory-absf-part-iii-an-example.aspx</link><pubDate>Wed, 11 Apr 2007 01:18:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780533</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780533</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/04/10/howto-application-block-software-factory-absf-part-iii-an-example.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;After an &lt;a href="http://adrianalonso.blogspot.com/2007/02/howto-application-block-software.html"&gt;introduction&lt;/a&gt; to ABSF and a explanation about &lt;a href="http://adrianalonso.blogspot.com/2007/03/howto-application-block-software.html"&gt;providers&lt;/a&gt;, here you have an example of how an application block and a provider library&amp;nbsp;can be&amp;nbsp;created. What I did was to take snapshots of the solution after executing each recipe:&lt;/p&gt; &lt;p&gt;1. New Animal Application Block&lt;br&gt;2. New Provider Factory and Base 'Animal'&lt;br&gt;3. New Provider (Typed) 'Dog'&lt;br&gt;4. New Provider (Untyped) 'Monkey'&lt;br&gt;5. New Design-Time Base Provider Node 'AnimalNode'&lt;br&gt;6. New Design-Time Provider Node 'DogNode'&lt;br&gt;7. New Provider Library&lt;br&gt;8. New Provider (Typed) 'Cat'&lt;br&gt;9. New Design-Time Provider Node 'CatNode'&lt;/p&gt; &lt;p&gt;The example is based on the Animal Application Block of &lt;a href="http://www.agileprogrammer.com/oneagilecoder/"&gt;Brian Button&lt;/a&gt;. Brian and &lt;a href="http://blogs.msdn.com/tomholl"&gt;Tom&lt;/a&gt; did a series of&amp;nbsp;webcasts explaining the Entlib Core and Design-Time&amp;nbsp;creating an Animal Application Block. You can download the&amp;nbsp;webcasts from &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032289570&amp;amp;EventCategory=5&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;here&lt;/a&gt; and &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032291157&amp;amp;EventCategory=5&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The idea is that you can open each snapshot and take a look at what stuff is created after executing each recipe. In order to build the snapshots, you will have to copy the Common.dll, Configuration.Design.dll and ObjectBuilder.dll to the lib folder of each snapshot. I recommend you to unzip the snapshots in a directory near the root (c:\) because of the&amp;nbsp;path length restriction (you won't be able to build the snapshots&amp;nbsp;if the path is longer than 248 characters)&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Finally here you have the link to the&amp;nbsp;&lt;a href="http://blog-adrianalonso.certant.com/blog/Animal Application Block and Library.zip"&gt;snapshots&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780533" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Application+Block+Software+Factory/default.aspx">Application Block Software Factory</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Entlib/default.aspx">Entlib</category><category domain="http://weblogs.asp.net/adalon/archive/tags/pattern+_2600_amp_3B00_+practices/default.aspx">pattern &amp;amp; practices</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/04/10/howto-application-block-software-factory-absf-part-iii-an-example.aspx</feedburner:origLink></item><item><title>Enterprise Library 3.0 Released!</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/Ko-spHEOaSo/enterprise-library-3-0-released.aspx</link><pubDate>Fri, 06 Apr 2007 14:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780534</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780534</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/04/06/enterprise-library-3-0-released.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I've been part of this&amp;nbsp;excited project mostly developing the Application Block Software Factory (ABSF) and some parts of the Validation Application Block (VAB) (which core and intergation support&amp;nbsp;was developed by &lt;a href="http://www.clariusconsulting.net/blogs/fds"&gt;Fernando&lt;/a&gt;). I want to thanks all to let me be part of this great experience and learn&amp;nbsp;a lot from this spectacular people.&amp;nbsp;&lt;/p&gt; &lt;p&gt;You can download it, start using it and provide feedback! Here you have the links:&lt;/p&gt; &lt;p&gt;Download: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=62ef5f79-daf2-43af-9897-d926f03b9e60&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=62ef5f79-daf2-43af-9897-d926f03b9e60&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=62ef5f79-daf2-43af-9897-d926f03b9e60&amp;amp;displaylang=en&lt;/a&gt;&lt;br&gt;Codeplex community site: &lt;a title="http://www.codeplex.com/entlib" href="http://www.codeplex.com/entlib"&gt;http://www.codeplex.com/entlib&lt;/a&gt;&lt;br&gt;Tom Hollander's Blog: &lt;a title="http://blogs.msdn.com/tomholl/" href="http://blogs.msdn.com/tomholl/"&gt;http://blogs.msdn.com/tomholl/&lt;/a&gt;&lt;br&gt;Olaf's Blog: &lt;a href="http://bloggingabout.net/blogs/olaf"&gt;http://bloggingabout.net/blogs/olaf&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780534" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/Entlib/default.aspx">Entlib</category><category domain="http://weblogs.asp.net/adalon/archive/tags/pattern+_2600_amp_3B00_+practices/default.aspx">pattern &amp;amp; practices</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/04/06/enterprise-library-3-0-released.aspx</feedburner:origLink></item><item><title>.Net Generic Finder (VS Automation Model Usage)</title><link>http://feedproxy.google.com/~r/AdrianAlonso/~3/-OF98nrIb1E/net-generic-finder-vs-automation-model-usage.aspx</link><pubDate>Wed, 04 Apr 2007 22:04:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3780536</guid><dc:creator>adalon</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/adalon/rsscomments.aspx?PostID=3780536</wfw:commentRss><comments>http://weblogs.asp.net/adalon/archive/2007/04/04/net-generic-finder-vs-automation-model-usage.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;This post was originally published at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://adrianalonso.blogspot.com"&gt;&lt;em&gt;&lt;font color="#808080"&gt;http://adrianalonso.blogspot.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I know there are Find/FindAll methods in&amp;nbsp;the System.Collection.* namespace but what I was looking for is something quite different. Here is more&amp;nbsp;or less&amp;nbsp;the scenario:&lt;/p&gt; &lt;p&gt;Suppose you have objects&amp;nbsp;that can be any of the following interfaces: Solution (S), Project (P)&amp;nbsp;or ProjectItem (PI). You don't have a common super type to treat all as&amp;nbsp;polymorphic objects.&amp;nbsp;So if you have a collection of them (Objects)&amp;nbsp;you are not able to have&amp;nbsp;Collection&amp;lt;T&amp;gt; where T is { S | P | PI } because you could have a mix of them (of course at least you have a Collection&amp;lt;Object&amp;gt; but in this&amp;nbsp;case we would not need Generics anyway).&lt;/p&gt; &lt;p&gt;I wanted a finder that allows me to search for an object in&amp;nbsp;this object&amp;nbsp;collection but using the benefits of Generics. I wanted to use&amp;nbsp;the most abstract representation of a collection I could have and I decided to use an IEnumerable parameter. Then I needed to define a Predicate&amp;lt;T&amp;gt; and&amp;nbsp;what I am going to&amp;nbsp;expect is&amp;nbsp;a T or&amp;nbsp;IEnumerable&amp;lt;T&amp;gt;&amp;nbsp;result.&lt;/p&gt; &lt;p&gt;For example:&amp;nbsp;If the&amp;nbsp;&lt;strong&gt;col&lt;/strong&gt; is&amp;nbsp;= {&amp;nbsp;S1, P1,&amp;nbsp;P2, P3, PI1, PI2, PI3 }&lt;/p&gt; &lt;p&gt;The following tests should pass:&lt;/p&gt; &lt;p&gt;1.&amp;nbsp;Finder.FindAll&amp;lt;&lt;strong&gt;Solution&lt;/strong&gt;&amp;gt;(&lt;strong&gt;col&lt;/strong&gt;, delegate( return Predicates.&lt;em&gt;GetNullPredicate&lt;/em&gt;&amp;lt;T&amp;gt;())) &lt;strong&gt;contains&lt;/strong&gt; {&lt;em&gt;S1&lt;/em&gt;}&lt;br&gt;2.&amp;nbsp;Finder.FindAll&amp;lt;&lt;strong&gt;Project&lt;/strong&gt;&amp;gt;(&lt;strong&gt;col&lt;/strong&gt;, delegate( return Predicates.&lt;em&gt;GetNullPredicate&lt;/em&gt;&amp;lt;T&amp;gt;())) &lt;strong&gt;contains&lt;/strong&gt; {&lt;em&gt;P1, P2, P3&lt;/em&gt;}&lt;br&gt;3.&amp;nbsp;Finder.FindAll&amp;lt;&lt;strong&gt;ProjectItem&lt;/strong&gt;&amp;gt;(&lt;strong&gt;col&lt;/strong&gt;, delegate( return Predicates.&lt;em&gt;GetNullPredicate&lt;/em&gt;&amp;lt;T&amp;gt;())) &lt;strong&gt;contains&lt;/strong&gt; {&lt;em&gt;PI1, PI2, PI3&lt;/em&gt;}&lt;/p&gt; &lt;p&gt;So I am&amp;nbsp;able to&amp;nbsp;get a IEnumerable&amp;lt;T&amp;gt; where T is { S | P | PI }. I could also specify&amp;nbsp;any other&amp;nbsp;predicate to&amp;nbsp;evaluate specific properties of each T. Notice that I am using the Predicates.Is&amp;lt;T&amp;gt; helper method I published in my &lt;a href="http://adrianalonso.blogspot.com/2007/04/andoris-predicates.html"&gt;previous post&lt;/a&gt; to validate if the predicate can be evaluated. I am also using the &lt;strong&gt;yield&lt;/strong&gt; support to collect the result.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Finder&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T Find&amp;lt;T&amp;gt;(IEnumerable elements, Predicate&amp;lt;T&amp;gt; predicate) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;br&gt;    {&lt;br&gt;        IEnumerator&amp;lt;T&amp;gt; enumerator = Find(elements, predicate, &lt;span class="kwrd"&gt;true&lt;/span&gt;).GetEnumerator();&lt;br&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; enumerator.MoveNext() ? enumerator.Current : &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; FindAll&amp;lt;T&amp;gt;(IEnumerable elements, Predicate&amp;lt;T&amp;gt; predicate) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; Find&amp;lt;T&amp;gt;(elements, predicate, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; Find&amp;lt;T&amp;gt;(IEnumerable elements, Predicate&amp;lt;T&amp;gt; predicate, &lt;span class="kwrd"&gt;bool&lt;/span&gt; returnFirst) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;null&lt;/span&gt; != elements)&lt;br&gt;        {&lt;br&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; element &lt;span class="kwrd"&gt;in&lt;/span&gt; elements)&lt;br&gt;            {&lt;br&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (Predicates.Is&amp;lt;T&amp;gt;(element, predicate))&lt;br&gt;                {&lt;br&gt;                    &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)element;&lt;br&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (returnFirst) &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3780536" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/adalon/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/adalon/archive/tags/C_2300_/default.aspx">C#</category><feedburner:origLink>http://weblogs.asp.net/adalon/archive/2007/04/04/net-generic-finder-vs-automation-model-usage.aspx</feedburner:origLink></item></channel></rss>
