<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0cFQ3Y4fip7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179</id><updated>2011-11-28T01:10:12.836+01:00</updated><category term="Unity" /><category term="C#" /><category term="Visual Studio" /><category term="software download" /><category term="design patterns (creational)" /><category term=".NET Framework" /><category term="design patterns" /><category term="Functional" /><category term="SUBVERSION" /><category term="TeamCity" /><category term="ASP.NET" /><category term="IT" /><title>dead devs society</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.deaddevssociety.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/BakopanosKonstantinos" /><feedburner:info uri="bakopanoskonstantinos" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEcNQX8zfSp7ImA9Wx9VFEs.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-9087881699446734407</id><published>2011-01-31T10:24:00.004+01:00</published><updated>2011-01-31T10:28:10.185+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-31T10:28:10.185+01:00</app:edited><title>Altering VS Project Properties the easy way</title><content type="html">Often I need to "batch" alter visual studio project properties for very large solutions. Example we decided to disable mandatory xml comments on all 275 visual studio projects we have. The following sample can give you an idea of how easy it is to write a small program to do this:-)&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

namespace ConsoleApplication17
{
    class Program
    {
        static void Main(string[] args)
        {
            XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
            //you could further parametrize these arguments...
            string[] files = Directory.GetFiles(@"C:\svn\chinook2.trunk\source", "*.csproj", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                RemoveElement(file, ns, "DocumentationFile");
            }
        }

        public static void RemoveElement(string xmlFile, XNamespace ns, string elementName)
        {            
            XDocument document = XDocument.Load(xmlFile, LoadOptions.None);            
            var elements = new List&lt;XElement&gt;(document.Descendants(ns + elementName));
            elements.ForEach(item=&gt;item.Remove());            
            document.Save(xmlFile);
        }

    }
}
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-9087881699446734407?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XTpj7MabaZtjKN8rFNRIexc96tc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XTpj7MabaZtjKN8rFNRIexc96tc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XTpj7MabaZtjKN8rFNRIexc96tc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XTpj7MabaZtjKN8rFNRIexc96tc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/2_d3Ez6lPis" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/9087881699446734407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2011/01/often-i-need-to-batch-alter-visual.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/9087881699446734407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/9087881699446734407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/2_d3Ez6lPis/often-i-need-to-batch-alter-visual.html" title="Altering VS Project Properties the easy way" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2011/01/often-i-need-to-batch-alter-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUCQHY_fCp7ImA9Wx9XFks.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5701847739159675434</id><published>2011-01-10T13:54:00.001+01:00</published><updated>2011-01-10T13:57:41.844+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T13:57:41.844+01:00</app:edited><title>recursively call a function...</title><content type="html">The following code fragment calls recursively a function calculating the sum of the Info integer property of every node in the tree... &lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
using System;
namespace ConsoleApplication11
{
    static class Program
    {
        static Func&lt;Node, int&gt; fSum = (node) =&gt; node.Info + (node.Left == null ? 0 : fSum(node.Left)) + (node.Right == null ? 0 : fSum(node.Right));

        static void Main(string[] args)
        {
            //tree of nodes
            var node = new Node {Info = 1, Left = new Node {Info = 1}};
            //print out sum
            Console.WriteLine(fSum(node));
            Console.ReadLine();
        }        
    }

    public class Node
    {
        public int Info { get; set; }
        public Node Left { get; set; }
        public Node Right { get; set; }
    }    
}
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
If you like your func inside the method then in order to get rid of the definite assignment issue (the use of a local variable which isn't definitely assigned).&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
using System;
namespace ConsoleApplication11
{
    static class Program
    {        
        static void Main(string[] args)
        {
            Func&lt;Node, int&gt; fSum;
            fSum = (node) =&gt; node.Info + (node.Left == null ? 0 : fSum(node.Left)) + (node.Right == null ? 0 : fSum(node.Right));
            //tree of nodes
            var node = new Node {Info = 1, Left = new Node {Info = 1}};
            //print out sum
            Console.WriteLine(fSum(node));
            Console.ReadLine();
        }        
    }

    public class Node
    {
        public int Info { get; set; }
        public Node Left { get; set; }
        public Node Right { get; set; }
    }    
}
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5701847739159675434?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uyd5XE8meerrZqvrrZP6IaPkHlA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyd5XE8meerrZqvrrZP6IaPkHlA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uyd5XE8meerrZqvrrZP6IaPkHlA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyd5XE8meerrZqvrrZP6IaPkHlA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/MyOLpHYWmoE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5701847739159675434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2011/01/recursively-call-function.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5701847739159675434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5701847739159675434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/MyOLpHYWmoE/recursively-call-function.html" title="recursively call a function..." /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2011/01/recursively-call-function.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4NQ3w6cCp7ImA9Wx5bEUQ.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-4531028361108270256</id><published>2010-10-27T18:46:00.001+02:00</published><updated>2010-10-27T18:46:32.218+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T18:46:32.218+02:00</app:edited><title>The Joel Test: 12 Steps to Better Code by Joel Spolsky</title><content type="html">&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test&lt;/a&gt;&amp;nbsp;(http://www.joelonsoftware.com/articles/fog0000000043.html)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Do you use source control?&lt;/li&gt;
&lt;li&gt;Can you make a build in one step?&lt;/li&gt;
&lt;li&gt;Do you make daily builds?&lt;/li&gt;
&lt;li&gt;Do you have a bug database?&lt;/li&gt;
&lt;li&gt;Do you fix bugs before writing new code?&lt;/li&gt;
&lt;li&gt;Do you have an up-to-date schedule?&lt;/li&gt;
&lt;li&gt;Do you have a spec?&lt;/li&gt;
&lt;li&gt;Do programmers have quiet working conditions?&lt;/li&gt;
&lt;li&gt;Do you use the best tools money can buy?&lt;/li&gt;
&lt;li&gt;Do you have testers?&lt;/li&gt;
&lt;li&gt;Do new candidates write code during their interview?&lt;/li&gt;
&lt;li&gt;Do you do hallway usability testing?&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;I strongly recommend this post! Read it :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-4531028361108270256?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fBKAUEBGV0ntqADob98vJYHMXg4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fBKAUEBGV0ntqADob98vJYHMXg4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fBKAUEBGV0ntqADob98vJYHMXg4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fBKAUEBGV0ntqADob98vJYHMXg4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/8lNfJq92fSs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/4531028361108270256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/joel-test-12-steps-to-better-code-by.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4531028361108270256?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4531028361108270256?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/8lNfJq92fSs/joel-test-12-steps-to-better-code-by.html" title="The Joel Test: 12 Steps to Better Code by Joel Spolsky" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/joel-test-12-steps-to-better-code-by.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4CQXszfCp7ImA9Wx5bEUo.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5920369409225860488</id><published>2010-10-27T07:03:00.002+02:00</published><updated>2010-10-27T12:56:00.584+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T12:56:00.584+02:00</app:edited><title>patterns &amp; practices: Prism – A lap around build events!</title><content type="html">&lt;p&gt;We all not and understand the notion of a Visual Studio Project and a Visual Studio Solution. &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/TMeyetIPRVI/AAAAAAAAANM/hOlkeFuhPrA/s1600-h/solutionsandprojects%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="solutionsandprojects" border="0" alt="solutionsandprojects" src="http://lh6.ggpht.com/_UqpPEshhhrk/TMeyfEo2i0I/AAAAAAAAANQ/Y1DH_60jmsU/solutionsandprojects_thumb%5B1%5D.png?imgmax=800" width="644" height="165"&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The point is that a solution has many projects and a project can belong to many solutions.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;Solution &amp;amp; Project format&lt;/h3&gt;&lt;p&gt;The format of a Visual Studio Project is MSBuild. The format of a Visual Studio Solution is something proprietary. It’s not even xml, it reminds me a basic(ish) look&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh5.ggpht.com/_UqpPEshhhrk/TMeyfbdYJiI/AAAAAAAAANU/6owPQwvVxq0/wlEmoticon-smile%5B2%5D.png?imgmax=800"&gt;By the way I never understood the reason that they didn’t use MsBuild also for solutions. The following is simply a random solution file.&lt;/p&gt;&lt;pre class="brush: xml"&gt;Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MVVM", "MVVM\MVVM.csproj", "{5071C191-7663-422C-AE32-4B638F6C12FA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MVVM.Test", "MVVM.Test\MVVM.Test.csproj", "{2399D68D-7791-4979-B1F7-FD17A6399E2B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5071C191-7663-422C-AE32-4B638F6C12FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5071C191-7663-422C-AE32-4B638F6C12FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5071C191-7663-422C-AE32-4B638F6C12FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5071C191-7663-422C-AE32-4B638F6C12FA}.Release|Any CPU.Build.0 = Release|Any CPU
{2399D68D-7791-4979-B1F7-FD17A6399E2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2399D68D-7791-4979-B1F7-FD17A6399E2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2399D68D-7791-4979-B1F7-FD17A6399E2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2399D68D-7791-4979-B1F7-FD17A6399E2B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;br /&gt;
&lt;h3&gt;Build Events&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;What is a build event? Well by default every project gets to override two build events: Pre-Build and Post-Build. You can attach your own batch functionality here. Personally if you understand MsBuild well enough then there are better and more MsBuild friendly ways to do this. I consider this the poor mans approach to hook before and after the build. &lt;strong&gt;&lt;u&gt;Stay tuned I will soon right a post on this…&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/TMeyfzYVeiI/AAAAAAAAANY/J1XMEvtAJNI/s1600-h/VisualStudioProperties%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VisualStudioProperties" border="0" alt="VisualStudioProperties" src="http://lh5.ggpht.com/_UqpPEshhhrk/TMeygeBg0-I/AAAAAAAAANc/SY1L508ZAQA/VisualStudioProperties_thumb%5B1%5D.png?imgmax=800" width="644" height="406"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Visual Studio provides also some help for you. If you click the “edit” buttons then you will get a simple editor with a list of “Macros”.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/TMeygggZ97I/AAAAAAAAANg/N1XC4ENinpw/s1600-h/macros%5B7%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="macros" border="0" alt="macros" src="http://lh6.ggpht.com/_UqpPEshhhrk/TMeyhCOmGlI/AAAAAAAAANk/R5Xjg1CLkb8/macros_thumb%5B3%5D.png?imgmax=800" width="644" height="402"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;These macros are nothing more than PropertyGroups inside the hierarchy of MsBuild files that define the project. No wonder the convention for referening to any of these is $(macro_name). &lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Don’t abuse the build events&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Wow, some very hard words. Abuse the build events? Well it can happen! Let’s take an example of a known open source project: Prism. You can download the sources at &lt;a title="http://compositewpf.codeplex.com/" href="http://compositewpf.codeplex.com/"&gt;http://compositewpf.codeplex.com/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Prism offers some nicely written AcceptanceTests. I strongly recommend it for better understanding of UI Test Automation. Now the problem they try to address for the AcceptanceTest developer is solution decoupling. The AcceptanceTest Project being a black box, has no dependencies on any of the sources. On the other side the AcceptanceTest developer needs the possibility to make sure that the sources are build before executing the tests. In order to address this the Prism team has use a post-build event on the AcceptanceTest project. &lt;/p&gt;&lt;pre class="brush:" plain&gt;$(MSBuildBinPath)\msbuild.exe "$(SolutionDir)..\MVVM.sln" /p:configuration=$(ConfigurationName)
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;The problems with this approach are the following:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;You are obliged to build your app every single time you build your tests. In a larger system you partition solutions in order to avoid having to load (or build) too many projects. The cycle of change-build-run needs to be as fast as possible. &lt;br /&gt;
&lt;li&gt;Making use of the $(SolutionDir) macro is not wise. Why? Well as I mention in the beginning of my post there can be a many-to-many relation between solutions and projects. As it’s easy to understand using the $(SolutionDir) macro forces you to be able to build the project ONLY within the context of the solution. Otherwise the relative path has a high risk to be wrong.&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&lt;u&gt;A better approach is you really like to use build events would be to use the $(ProjectPath) macro. &lt;/u&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;
&lt;p&gt;In a bigger system you will NEVER build solutions. Typically you build groups of projects in a well defined sequence. I include a sample of how to do this. My recommendation: don’t build solutions, build projects. &lt;/p&gt;&lt;script type="syntaxhighlighter" class="brush: xml"&gt;&lt;![CDATA[

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;project ToolsVersion="4.0" 
DefaultTargets="BuildAll" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

&lt;itemgroup&gt;  
&lt;prismlibraryfiles Include="PrismLibrary\**\*.csproj;" /&gt; 
&lt;chartcontrolsfiles Include="ChartControls\**\*.csproj;" /&gt; 
&lt;acceptancetestlibraryfiles Include="AcceptanceTestLibrary\**\*.csproj;" /&gt; 

&lt;stocktraderrifiles Include="StockTrader RI\**\*.csproj;" /&gt; 
&lt;mvvmrifiles Include="MVVM RI\**\*.csproj;" /&gt; 

&lt;/ItemGroup&gt;

&lt;target Name="BuildAll"&gt;

&lt;msbuild Projects="@(PrismLibraryFiles)" /&gt; 
&lt;msbuild Projects="@(ChartControlsFiles)" /&gt;
&lt;msbuild Projects="@(AcceptanceTestLibraryFiles)" /&gt;

&lt;msbuild Projects="@(StockTraderRIFiles)" /&gt;
&lt;msbuild Projects="@(MVVMRIFiles)" /&gt;

&lt;/Target&gt;

&lt;/Project&gt;

]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5920369409225860488?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BjIAiZAtUf2YDcSJTY3g-yZb6MM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BjIAiZAtUf2YDcSJTY3g-yZb6MM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BjIAiZAtUf2YDcSJTY3g-yZb6MM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BjIAiZAtUf2YDcSJTY3g-yZb6MM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/fTpjHunIe6w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5920369409225860488/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/patterns-practices-prism-lap-around.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5920369409225860488?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5920369409225860488?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/fTpjHunIe6w/patterns-practices-prism-lap-around.html" title="patterns &amp;amp; practices: Prism – A lap around build events!" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_UqpPEshhhrk/TMeyfEo2i0I/AAAAAAAAANQ/Y1DH_60jmsU/s72-c/solutionsandprojects_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/patterns-practices-prism-lap-around.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ABSXw7eyp7ImA9Wx5bEUg.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-708052536298299948</id><published>2010-10-24T03:02:00.004+02:00</published><updated>2010-10-27T05:55:58.203+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T05:55:58.203+02:00</app:edited><title>Configuration Patterns (a lap around ent lib configuration)</title><content type="html">I have being following the work of the Patterns &amp;amp; Practices team for many years now. My initial motivation was the Logging Application Block. Although the team has made significant progress the last 6-7 years it seems to me that they have being making circles in the area of configuration. Let me explain what I mean. &lt;br /&gt;
&lt;h3&gt;The Facade pattern (&lt;a href="http://en.wikipedia.org/wiki/Facade_pattern" title="http://en.wikipedia.org/wiki/Facade_pattern"&gt;http://en.wikipedia.org/wiki/Facade_pattern&lt;/a&gt;)&lt;/h3&gt;A facade is an object that provides a simplified interface to a larger body of code. A facade can: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;make a software library easier to use, understand and test, since the facade has convenient methods for common tasks;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;make code that uses the library more readable, for the same reason;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs). &lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;&lt;h3&gt;The Adapter Pattern (&lt;a href="http://en.wikipedia.org/wiki/Adapter_pattern" title="http://en.wikipedia.org/wiki/Adapter_pattern"&gt;http://en.wikipedia.org/wiki/Adapter_pattern&lt;/a&gt;)&lt;/h3&gt;The &lt;b&gt;adapter pattern&lt;/b&gt; (often referred to as the &lt;b&gt;wrapper pattern&lt;/b&gt; or simply a &lt;b&gt;wrapper&lt;/b&gt;) translates one interface for a class into a compatible interface. An &lt;i&gt;adapter&lt;/i&gt; allows classes to work together that normally could not because of incompatible interfaces, by providing its interface to clients while using the original interface. The adapter translates calls to its interface into calls to the original interface, and the amount of code necessary to do this is typically small. The adapter is also responsible for transforming data into appropriate forms. For instance, if multiple boolean values are stored as a single integer but your consumer requires a 'true'/'false', the adapter would be responsible for extracting the appropriate values from the integer value. &lt;br /&gt;
&lt;h3&gt;Configuration equals to code&lt;/h3&gt;To my understanding a configuration file is nothing but source code. The fact that it’s format is XML for example and not csharp, doesn’t mean it is less important than the rest of your source code. As a rule of thumb: anything that alters the behavior of your system at runtime is source code. A good example is XAML, I guess nobody will disagree that XAML is source code. On the other side the customers table on your database is not source code. So if we have all agreed that the configuration of your logging facility is source code, I don’t understand why the two patterns above do not apply to configuration files also.  &lt;br /&gt;
&lt;h3&gt;Configuration Façade Pattern&lt;/h3&gt;Let’s assume that your logging facility has say a complex and over engineered schema like the one that the Logging application block has. How can you shield your app from complexity, both in code and config?  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;In the few first iterations use the block as it is. Don’t try to upfront decide what features of the logging block you need and don’t rush into simplifying the configuration schema. You run into a serious risk here: you are aborting completely an agile approach and you risk loosing valuable time during the initial iterations with less significant issues such as your logging. In addition such cross-cutting concerns require the full attention of the high level architect. Well guess what: the architect has mainly to worry about the domain in the beginning of a project. Wrong decisions in the domain area cannot be easily reverted. the most important think in software development is to build a creative collaboration between technical and domain experts to iteratively cut ever closer to the conceptual heart of the problem.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Once you have delivered some bits and you have the team aligned and running it’s then time to start taking care of cross-domain facilities. Make a thorough investigation of what features of the logger you currently use. Most likely you will not need any more features from the block. Then based on your findings create a simple interface (something like an ILoggerFacade) that abstracts all you need from the logger. In addition create a simple xml schema to define the configuration you need for your logger. Try to keep it simple and as flat as possible.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Keeping the log configuration schema simple might be challenging. You as an architect might have problems with dev leads or crazy devs who cannot think out-of-the-box. They will argue that you need to leave a “window of opportunity” open for the future. I always answer back that the widest window of opportunity is simplicity. &lt;/li&gt;
&lt;/ul&gt;When you design your configuration schema (I call also it Configuration Facade) you should also always have in mind your users. How is the app deployed? Where? Who is using it?  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;A web app needs to provide a configuration façade flexible enough to allow IT staff to alter it. I believe that the config tool that ent lib provides is a developer tool not something that IT can really utilize. The existence of the tool cannot hide the complexity of the xml schema.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;On the other hand a desktop app needs to be able to be configured within the main user interface. You cannot expect your user to use another tool (say the ent lib config tool) to twist the log settings. Further more if things get really bad and your you are providing end-user support, then you should make sure that your support staff is in a position to guide the user through a simple process to change some settings. &lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Configuration Adapter Pattern&lt;/h3&gt;Let’s assume that you need to use a different log library. If you have a simple logger façade then inferring an adapter to do the switch is fairly simple. Don’t forget, the configuration. You also need to deal with config files. If you have a good and simple configuration façade then making a configuration adapter is also very simple. The problem I often have when changing from one library to another is all configuration. Don’t “vendor lock” your self. Don’t directly use the ent lib configuration. It will not be easy to change. Believe me. &lt;br /&gt;
&lt;h3&gt;3rdparty cherry picking / consistent configuration&lt;/h3&gt;There is no question that you need to have the possibility to cherry pick your 3rd party. Example: use logger from one vendor and caching from another. The ent lib has being designed to be cherry picked…. except the configuration. Why? Well because every 3rd party has a different configuration schema. Again: think your users… they have to be confronted with so many different xml config schemas. It doesn’t look consistent. It’s even confusing for developers. In addition your own app will need some kind of configuration. How many schemas are you going to maintain? Another issue is that in some cases you need the flexibility to play with config files at build and install time. The more files you have the more difficult and risky this process becomes. &lt;br /&gt;
&lt;h3&gt;StockTraderRI (a simple example)&lt;/h3&gt;The bla – bla – blabity above is pointless without an example. Instead of making my own sample, I have chosen to demonstrate the configuration patterns inside the latest (V4 drop 10) StockTraderRI application that ships with &lt;a href="http://compositewpf.codeplex.com/" target="_blank"&gt;Prism&lt;/a&gt;. What we will do is replace the log configuration with our own adapter. The prism team has done an excellent job isolating the code from the logging block in this sample. &lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue;"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EnterpriseLibraryLoggerAdapter &lt;/span&gt;: &lt;span style="color: #2b91af;"&gt;ILoggerFacade
&lt;/span&gt;{
&lt;span style="color: blue;"&gt;#region &lt;/span&gt;ILoggerFacade Members
&lt;span style="color: blue;"&gt;public void &lt;/span&gt;Log(&lt;span style="color: blue;"&gt;string &lt;/span&gt;message, &lt;span style="color: #2b91af;"&gt;Category &lt;/span&gt;category, &lt;span style="color: #2b91af;"&gt;Priority &lt;/span&gt;priority)
{
&lt;span style="color: #2b91af;"&gt;Logger&lt;/span&gt;.Write(message, category.ToString(), (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)priority);
}
&lt;span style="color: blue;"&gt;#endregion
&lt;/span&gt;}&lt;/pre&gt;The immediate benefit we have from this simple adapter (could also call it facade) is that out of the 13 projects this solution has only one project needs references to “Microsoft.Practices.EnterpriseLibrary.Logging.dll”. This is simply beautiful design! Now we will do mthe same for the configuration. &lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue;"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EnterpriseLibraryLoggerAdapterConfiguration &lt;/span&gt;: &lt;span style="color: #2b91af;"&gt;ConfigurationSection
&lt;/span&gt;{
&lt;span style="color: blue;"&gt;public &lt;/span&gt;Configure()
{
&lt;span style="color: blue;"&gt;var &lt;/span&gt;builder = &lt;span style="color: blue;"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ConfigurationSourceBuilder&lt;/span&gt;();

builder.ConfigureLogging()
.LogToCategoryNamed(&lt;span style="color: #a31515;"&gt;"General"&lt;/span&gt;)
.SendTo.FlatFile(&lt;span style="color: #a31515;"&gt;"General Log File"&lt;/span&gt;)
.FormatWith(&lt;span style="color: blue;"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;FormatterBuilder&lt;/span&gt;()
.TextFormatterNamed(&lt;span style="color: #a31515;"&gt;"Text Formatter"&lt;/span&gt;)
.UsingTemplate(&lt;span style="color: #a31515;"&gt;"Timestamp: {timestamp}...{newline})}"&lt;/span&gt;))
.ToFile(FileName);

&lt;span style="color: blue;"&gt;var &lt;/span&gt;configSource = &lt;span style="color: blue;"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DictionaryConfigurationSource&lt;/span&gt;();
builder.UpdateConfigurationWithReplace(configSource);
&lt;span style="color: #2b91af;"&gt;EnterpriseLibraryContainer&lt;/span&gt;.Current
= &lt;span style="color: #2b91af;"&gt;EnterpriseLibraryContainer&lt;/span&gt;.CreateDefaultContainer(configSource);
}

[&lt;span style="color: #2b91af;"&gt;ConfigurationProperty&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"fileName"&lt;/span&gt;)]
&lt;span style="color: blue;"&gt;public string &lt;/span&gt;FileName
{
&lt;span style="color: blue;"&gt;get &lt;/span&gt;{ &lt;span style="color: blue;"&gt;return this&lt;/span&gt;[&lt;span style="color: #a31515;"&gt;"fileName"&lt;/span&gt;] &lt;span style="color: blue;"&gt;as string&lt;/span&gt;; }
}
}&lt;/pre&gt;I have kept the sample simple so the only parameter I configure for now is the file name. It’s not difficult to add more! Next you need to add the new typed section. Note the goodness here! You don’t need to add complex and loaded sections from ent lib. &lt;b&gt;&lt;i&gt;You have total control!&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;configSections&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;section &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;logAdapter&lt;/span&gt;" 
&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;StockTraderRI.EnterpriseLibraryLoggerAdapterConfiguration,StockTraderRI&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;
&amp;lt;!--&lt;/span&gt;&lt;span style="color: green;"&gt;more sections follow&lt;/span&gt;&lt;span style="color: blue;"&gt;--&amp;gt;
&lt;/span&gt;&lt;/pre&gt;You also need of course to specify the settings for the section.&lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;logAdapter &lt;/span&gt;&lt;span style="color: red;"&gt;fileName&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;general.log&lt;/span&gt;" &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: #222222;"&gt;Somewhere you need to instantiate the ConfigSection in code and call the configure method&lt;/span&gt;&lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue;"&gt;var &lt;/span&gt;section = (&lt;span style="color: #2b91af;"&gt;SomeConfig&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;ConfigurationManager&lt;/span&gt;.GetSection(&lt;span style="color: #a31515;"&gt;"logAdapter"&lt;/span&gt;);
section.&lt;span style="color: red;"&gt;Configure&lt;/span&gt;();
&lt;/pre&gt;This is it. Only for comparison I will show you what used to be inside the sample in respect to logging. &lt;b&gt;I call this kind of configuration “THICK GLUE”. Don’t infer glue inside your application. Believe me it’s not a good idea. By the way: the glue is not harassing only you. It causes more pain to the patterns and practices team. Just imagine: they have to support all that, they have lost the right and the freedom to move on!&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: xml" type="syntaxhighlighter"&gt;
  &lt;loggingconfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"&gt;
    &lt;listeners&gt;
      &lt;add fileName="trace.log" header="----------------------------------------" footer="----------------------------------------" formatter="Text Formatter" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="FlatFile TraceListener"/&gt;
    &lt;/listeners&gt;
    &lt;formatters&gt;
      &lt;add template="Timestamp: {timestamp}
Message: {message}
Category: {category}
Priority: {priority}
EventId: {eventid}
Severity: {severity}
Title:{title}
Machine: {machine}
Application Domain: {appDomain}
Process Id: {processId}
Process Name: {processName}
Win32 Thread Id: {win32ThreadId}
Thread Name: {threadName}
Extended Properties: {dictionary({key} - {value}
)}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="Text Formatter"/&gt;
    &lt;/formatters&gt;
    &lt;categorysources&gt;
      &lt;add switchValue="All" name="Debug"&gt;
        &lt;listeners&gt;
          &lt;add name="FlatFile TraceListener"/&gt;
        &lt;/listeners&gt;
      &lt;/add&gt;
      &lt;add switchValue="All" name="General"&gt;
        &lt;listeners&gt;
          &lt;add name="FlatFile TraceListener"/&gt;
        &lt;/listeners&gt;
      &lt;/add&gt;
    &lt;/categorySources&gt;
    &lt;specialsources&gt;
      &lt;allevents switchValue="All" name="All Events"/&gt;
      &lt;notprocessed switchValue="All" name="Unprocessed Category"/&gt;
      &lt;errors switchValue="All" name="Logging Errors &amp;amp; Warnings"&gt;
        &lt;listeners&gt;
          &lt;add name="FlatFile TraceListener"/&gt;
        &lt;/listeners&gt;
      &lt;/errors&gt;
    &lt;/specialSources&gt;
  &lt;/loggingConfiguration&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;h3&gt;Log Format tips&lt;/h3&gt;If you are developing an application that is a web app or if you provide support for your desktop app the read the following lines very carefully.&lt;br /&gt;
The format of your log files is also an interface! You cannot change it anytime you like. Log files are usually read by IT staff and 1st level support staff before the ticket arrives to you as a bug. What most organizations do is attach log files together with the issues/bugs in order that they can search later in time (kind-of knowledge base). In addition you need to provide instructions to IT and support staff about how to interpret the log files at a high level. This is why I believe that the possibility to alter the format is a super-flexible way via configuration can be very tricky. So unless you have concrete requirements that formats need to change by configuration… hard code a simple format.&lt;br /&gt;
&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;The ideas mentioned do not only apply to p&amp;amp;p libraries. WCF configuration is another example. I use WCF extensively. I have noticed that from all the noise inside the wcf config files (especially the client ones) nobody ever touches anything if the developer is not present. So what I do with WCF config files is exactly the same. Configuration Facades and Configuration Adapters!&lt;br /&gt;
&lt;b&gt;&lt;i&gt;I used the logging block of p&amp;amp;p as an example because I simply love the work and effort of this team!&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;h3&gt;Feedback&lt;/h3&gt;That’s all folks! The drop for the first iteration of this paper. Please send me feedback&lt;img alt="Smile" class="wlEmoticon wlEmoticon-smile" src="http://lh6.ggpht.com/_UqpPEshhhrk/TMOhOGh6dkI/AAAAAAAAANI/CeMNdp6G_TQ/wlEmoticon-smile%5B2%5D.png?imgmax=800" style="border-style: none;" /&gt;  &lt;br /&gt;
I will post soon another related idea that I call configuration injection. It’s basically the idea of injecting typed configuration at a module level using either Unity extensions or the prism module catalog. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-708052536298299948?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QEsec6NS--j45uCuJp0d4bbMkzg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEsec6NS--j45uCuJp0d4bbMkzg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QEsec6NS--j45uCuJp0d4bbMkzg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEsec6NS--j45uCuJp0d4bbMkzg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/fRH2tceTEEY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/708052536298299948/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/configuration-patterns-lap-around-ent.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/708052536298299948?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/708052536298299948?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/fRH2tceTEEY/configuration-patterns-lap-around-ent.html" title="Configuration Patterns (a lap around ent lib configuration)" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_UqpPEshhhrk/TMOhOGh6dkI/AAAAAAAAANI/CeMNdp6G_TQ/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/configuration-patterns-lap-around-ent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCQX04fyp7ImA9Wx5UGEo.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5529984208933447138</id><published>2010-10-24T00:10:00.001+02:00</published><updated>2010-10-24T00:14:20.337+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-24T00:14:20.337+02:00</app:edited><title>Visual Studio 2010–Community Wallpapers</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/TMNdV3K0TxI/AAAAAAAAAMk/ZTLxAVKokRw/s1600-h/Logo_MS_Visual_Studio%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Logo Microsoft Visual Studio" border="0" alt="Logo Microsoft Visual Studio" src="http://lh6.ggpht.com/_UqpPEshhhrk/TMNdWZaRpBI/AAAAAAAAAMo/T3yGY-VzkRE/Logo_MS_Visual_Studio_thumb.jpg?imgmax=800" width="244" height="97"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If you are in love with visual studio… just as much as I am then you will definitely love this link!&lt;/p&gt; &lt;p&gt;&lt;a title="http://vs2010wallpapers.com/" href="http://vs2010wallpapers.com/"&gt;http://vs2010wallpapers.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A non-Microsoft site, filled with Community Created Visual Studio 2010 Wallpapers!&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeM-o9OpI/AAAAAAAAAMs/mrmFduCQdww/s1600-h/image%5B2%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeNRiXvPI/AAAAAAAAAMw/IHGdgYSRhvw/image_thumb.png?imgmax=800" width="244" height="154"&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/TMNeNs5ZwwI/AAAAAAAAAM0/XyU78yojv4Q/s1600-h/image%5B5%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeNzqBfrI/AAAAAAAAAM4/13opi1j0Q88/image_thumb%5B1%5D.png?imgmax=800" width="244" height="154"&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeOcofaXI/AAAAAAAAAM8/1mn--AoDkTI/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeOlJeQ0I/AAAAAAAAANA/GrfLN6bJouI/image_thumb%5B2%5D.png?imgmax=800" width="244" height="154"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;… and many many more! Check it out&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh4.ggpht.com/_UqpPEshhhrk/TMNeOzqxOmI/AAAAAAAAANE/99cNXwAU2nw/wlEmoticon-smile%5B2%5D.png?imgmax=800"&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5529984208933447138?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x9yGqMUgcTUGURmWKIKA2eycVmc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x9yGqMUgcTUGURmWKIKA2eycVmc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x9yGqMUgcTUGURmWKIKA2eycVmc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x9yGqMUgcTUGURmWKIKA2eycVmc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/ec23ONOGELE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5529984208933447138/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/visual-studio-2010community-wallpapers.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5529984208933447138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5529984208933447138?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/ec23ONOGELE/visual-studio-2010community-wallpapers.html" title="Visual Studio 2010–Community Wallpapers" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_UqpPEshhhrk/TMNdWZaRpBI/AAAAAAAAAMo/T3yGY-VzkRE/s72-c/Logo_MS_Visual_Studio_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/visual-studio-2010community-wallpapers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANRXYzfSp7ImA9Wx5UF0U.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8626864820261769823</id><published>2010-10-23T00:44:00.002+02:00</published><updated>2010-10-23T00:49:54.885+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-23T00:49:54.885+02:00</app:edited><title>patterns &amp; practices Symposium Redmond 2010</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UqpPEshhhrk/TMISxqqJf9I/AAAAAAAAAMU/56VDOxogwTI/s1600/DSC_0091.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/_UqpPEshhhrk/TMISxqqJf9I/AAAAAAAAAMU/56VDOxogwTI/s320/DSC_0091.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;a href="http://msdn.microsoft.com/en-us/practices/dd578307.aspx"&gt;patterns and practices symposium in Redmond&lt;/a&gt; this year was just great. What I like about the p&amp;amp;p conferences is the personal contact that you get to have with the team. This is practically impossible in any bigger event. I have attended this event 4 years in row... had to travel all the way from Europe for this. It was worth it!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UqpPEshhhrk/TMIUdOx7NdI/AAAAAAAAAMY/RetmlJePHso/s1600/DSC_0129.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TMIUdOx7NdI/AAAAAAAAAMY/RetmlJePHso/s320/DSC_0129.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UqpPEshhhrk/TMIU_DSN6LI/AAAAAAAAAMc/L2iIFZi4U5o/s1600/DSC_0001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TMIU_DSN6LI/AAAAAAAAAMc/L2iIFZi4U5o/s320/DSC_0001.jpg" width="275" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8626864820261769823?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zPcp8X5JCaeuNYZ7_Rml3vjHDkM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zPcp8X5JCaeuNYZ7_Rml3vjHDkM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zPcp8X5JCaeuNYZ7_Rml3vjHDkM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zPcp8X5JCaeuNYZ7_Rml3vjHDkM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/wNojTbeFPek" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8626864820261769823/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/patterns-and-practices-symposium-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8626864820261769823?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8626864820261769823?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/wNojTbeFPek/patterns-and-practices-symposium-in.html" title="patterns &amp; practices Symposium Redmond 2010" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_UqpPEshhhrk/TMISxqqJf9I/AAAAAAAAAMU/56VDOxogwTI/s72-c/DSC_0091.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/patterns-and-practices-symposium-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4DQn05fyp7ImA9Wx5UFUw.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5288935003639301598</id><published>2010-10-19T20:59:00.002+02:00</published><updated>2010-10-19T21:02:53.327+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-19T21:02:53.327+02:00</app:edited><title>Speed up your Unity Container!</title><content type="html">The Unity Application Block (Unity) http://www.codeplex.com/unity is a lightweight extensible dependency injection container with support for constructor, property, and method call injection.&lt;br /&gt;
Unity offers supports 3 types of injection: Property, Constructor and Method Injection.&lt;br /&gt;
If you are prepared to trade Property and Method Injection for better performance... then continue reading. I will describe in simple steps how to disable Property and Method Injection. &lt;br /&gt;
Sadly you will need to comment out 4 lines from the Unity sources and recompile. I hope someday the Unity dev team provides the possibility to specify what types of injections your container should support upon container creation.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Step 1: UnityDefaultStrategiesExtension.cs&lt;/h3&gt;&lt;br /&gt;
You need to comment out the following 4 lines:&lt;br /&gt;
&lt;br /&gt;
Context.BuildPlanStrategies.AddNew&lt;DynamicMethodPropertySetterStrategy&gt;(&lt;br /&gt;
    UnityBuildStage.Initialization);&lt;br /&gt;
 &lt;br /&gt;
Context.BuildPlanStrategies.AddNew&lt;DynamicMethodCallStrategy&gt;(&lt;br /&gt;
    UnityBuildStage.Initialization);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Context.Policies.SetDefault&lt;IPropertySelectorPolicy&gt;(&lt;br /&gt;
    new DefaultUnityPropertySelectorPolicy());&lt;br /&gt;
 &lt;br /&gt;
Context.Policies.SetDefault&lt;IMethodSelectorPolicy&gt;(&lt;br /&gt;
    new DefaultUnityMethodSelectorPolicy());&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
//===============================================================================
// Microsoft patterns &amp; practices
// Unity Application Block
//===============================================================================
// Copyright © Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using Microsoft.Practices.ObjectBuilder2;
using Microsoft.Practices.Unity.ObjectBuilder;

namespace Microsoft.Practices.Unity
{
    /// &lt;summary&gt;
    /// This extension installs the default strategies and policies into the container
    /// to implement the standard behavior of the Unity container.
    /// &lt;/summary&gt;
    public partial class UnityDefaultStrategiesExtension : UnityContainerExtension
    {
        /// &lt;summary&gt;
        /// Add the default ObjectBuilder strategies &amp;amp; policies to the container.
        /// &lt;/summary&gt;
        protected override void Initialize()
        {
            //
            // Main strategy chain
            //
            Context.Strategies.AddNew&lt;buildkeymappingstrategy&gt;(UnityBuildStage.TypeMapping);
            Context.Strategies.AddNew&lt;hierarchicallifetimestrategy&gt;(UnityBuildStage.Lifetime);
            Context.Strategies.AddNew&lt;lifetimestrategy&gt;(UnityBuildStage.Lifetime);

            Context.Strategies.AddNew&lt;arrayresolutionstrategy&gt;(UnityBuildStage.Creation);
            Context.Strategies.AddNew&lt;buildplanstrategy&gt;(UnityBuildStage.Creation);

            //
            // Build plan strategy chain
            //
            Context.BuildPlanStrategies.AddNew&lt;dynamicmethodconstructorstrategy&gt;(
                UnityBuildStage.Creation);
            /*
            Context.BuildPlanStrategies.AddNew&lt;dynamicmethodpropertysetterstrategy&gt;(
                UnityBuildStage.Initialization);
            Context.BuildPlanStrategies.AddNew&lt;dynamicmethodcallstrategy&gt;(
                UnityBuildStage.Initialization);
            */

            //
            // Policies - mostly used by the build plan strategies
            //
            Context.Policies.SetDefault&lt;iconstructorselectorpolicy&gt;(
                new DefaultUnityConstructorSelectorPolicy());
            /*
            Context.Policies.SetDefault&lt;ipropertyselectorpolicy&gt;(
                new DefaultUnityPropertySelectorPolicy());
            Context.Policies.SetDefault&lt;imethodselectorpolicy&gt;(
                new DefaultUnityMethodSelectorPolicy());
            */

            SetDynamicBuilderMethodCreatorPolicy();

            Context.Policies.SetDefault&lt;ibuildplancreatorpolicy&gt;(
                new DynamicMethodBuildPlanCreatorPolicy(Context.BuildPlanStrategies));

            Context.Policies.Set&lt;ibuildplanpolicy&gt;(
                new DeferredResolveBuildPlanPolicy(),
                typeof(Func&lt;&gt;));
            Context.Policies.Set&lt;ilifetimepolicy&gt;(
                new PerResolveLifetimeManager(),
                typeof (Func&lt;&gt;));
        }
    }
}
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Step 2: Recompile&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5288935003639301598?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a-qLoyF6lyHYXc6xEBqE2DPuSEc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a-qLoyF6lyHYXc6xEBqE2DPuSEc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a-qLoyF6lyHYXc6xEBqE2DPuSEc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a-qLoyF6lyHYXc6xEBqE2DPuSEc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/BpddO1knHKo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5288935003639301598/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/10/speed-up-your-unity-container.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5288935003639301598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5288935003639301598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/BpddO1knHKo/speed-up-your-unity-container.html" title="Speed up your Unity Container!" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/10/speed-up-your-unity-container.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QASH88eCp7ImA9Wx5WGEo.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8080020043963358830</id><published>2010-09-28T17:00:00.003+02:00</published><updated>2010-09-30T22:42:29.170+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-30T22:42:29.170+02:00</app:edited><title>Well Defined Model: Model+ViewViewModel</title><content type="html">&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;The formal ModelViewViewModel pattern defines only 3 parts, the “View” and “ViewModel” are clearly defined and the rest we simply call “Model”. &amp;nbsp;Is this enough? Absolutely not. There is a lot more to worry about than simply separating the visuals from code! &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;When building a composite application it’s vital to assign well define the responsibilities on each part and then stick with the rules you have defined.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;I call the pattern “Model+” since in this case the Model has being well defined. So from this paper don’t expect anything special about the “View”-“ViewModel” pair. We all think we understand this one; the “Model” part is the key were all the problems arise!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;The following design addresses many scenarios in a composite application. It’s simply one design, nothing more. You can find the source code with a sample application under: &lt;/span&gt;&lt;/span&gt;&lt;a href="https://bakopanos.googlecode.com/svn/trunk/prism"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="color: blue; font-family: Calibri;"&gt;https://bakopanos.googlecode.com/svn/trunk/prism&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt; &lt;br /&gt;
The sample is a modified version of the original sample that ships with the Prism quickstarts.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UqpPEshhhrk/TKIC03XbuDI/AAAAAAAAAMQ/-pkXXVn-lTk/s1600/model+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" px="true" src="http://3.bp.blogspot.com/_UqpPEshhhrk/TKIC03XbuDI/AAAAAAAAAMQ/-pkXXVn-lTk/s640/model+.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style="margin: 10pt 0cm 0pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="color: #4f81bd;"&gt;&lt;span style="font-family: Cambria;"&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;The controller is responsible to create views and position the views on the appropriate placeholders. For example if you are using Prism (Composite WPF) these placeholders are called Regions and there is a RegionManager and a RegionRegistry to deal with regions. Another concern that the controller has is to activate views. For example activate the tab page in a tabstrip that contains the view you would like to show. It's appropriate to say that the controller orchestrates the&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;b&gt;User Interface Process&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;It’s important to make sure that you decouple UIP from all the rest. This is the reason that an eventaggregator comes very handy here. The controller can subscribe to strongly types events and get notified about changes in the state. Typically in most cases this will be notification about selected item in a workflow or dirty items.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin: 10pt 0cm 0pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="color: #4f81bd;"&gt;&lt;span style="font-family: Cambria;"&gt;View&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;In order to implement correctly the Model-View-ViewModel pattern (Fowler: PresentationModel) you really need to restrict the View to only the visuals. The Passive View doesn’t require any unit testing and the visual designer can work decoupled from the developer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin: 10pt 0cm 0pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="color: #4f81bd;"&gt;&lt;span style="font-family: Cambria;"&gt;ViewModel&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;When I think about ViewModels I really see them as facades. I am aware that most people see workflows as the place where all logic goes; the problem is that if you put too much in a ViewModel then better consider a ModelViewController approach. What I see sometimes is ViewModels being sub classed in order to allow reuse. To my understanding this is by definition wrong. A ViewModel should simply aggregate all that the view needs to display and provide them to the view in a simple structure. You can also have logic there that has to do with the current view, but nothing more.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin: 10pt 0cm 0pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="color: #4f81bd;"&gt;&lt;span style="font-family: Cambria;"&gt;WorkItem&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;The work item is the key to a composite application. Why? Because the workitem is where you store your state. Let’s consider an example: Your application should change to the current customer. In other words after you select the customer in a list box, anything that you do in any screen should consider that specific customer. So if you get a bug assigned to you that somewhere in the application the customer is not displayed properly, where is the place where you first look? What part of your architecture remembers that? To my understanding this should be the WorkItem.&amp;nbsp; The ViewModel binds the selected item to the workitem, and when the selected item changes the workitem publishes an event. The interested controllers register for that event and drive in turn any UIP.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin: 10pt 0cm 0pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="color: #4f81bd;"&gt;&lt;span style="font-family: Cambria;"&gt;Services&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;BEWARE: services should be stateless. This is very important. If you would like your application to be easily changed and tested then model anything that has to do with state in a WorkItem. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;There are two categories of services:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt;"&gt;&lt;span lang="EN-GB" style="font-family: Symbol;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;Infrastructure Services, basically cross-domain functionality. Example ILogService&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 10pt 36pt; text-indent: -18pt;"&gt;&lt;span lang="EN-GB" style="font-family: Symbol;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family: Calibri;"&gt;Services, that interact with the business/service layer in order to support the application with domain specific functionality. Example IProjectService&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 10pt 36pt; text-indent: -18pt;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8080020043963358830?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Upk0xoMfNYyAEKPPhe6YNSNhEaU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Upk0xoMfNYyAEKPPhe6YNSNhEaU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Upk0xoMfNYyAEKPPhe6YNSNhEaU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Upk0xoMfNYyAEKPPhe6YNSNhEaU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/WxyyYlICqgs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8080020043963358830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/09/well-defined-model-modelviewviewmodel.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8080020043963358830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8080020043963358830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/WxyyYlICqgs/well-defined-model-modelviewviewmodel.html" title="Well Defined Model: Model+ViewViewModel" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UqpPEshhhrk/TKIC03XbuDI/AAAAAAAAAMQ/-pkXXVn-lTk/s72-c/model+.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/09/well-defined-model-modelviewviewmodel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4GRXY4cCp7ImA9Wx5XEkw.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-6618907834265590217</id><published>2010-09-11T16:18:00.001+02:00</published><updated>2010-09-11T16:22:04.838+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-11T16:22:04.838+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Functional" /><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Functional Construction Pattern: Parsing a csv file.</title><content type="html">The Functional Construction Pattern is used to construct a tree or graph of objects, with a code structure similar to what is used in functional programming languages. It is also called the Transform Pattern because it's used to create a new object graph based on a given one.  Using the functional construction pattern you write code that is a lot more declarative (the structure of the generated object graph is visible in the code). One drawback is that code is not as easy to debug. In order to understand the pattern let's take the example of parsing a csv file into a collection of objects.  &lt;h3&gt;Sample csv file&lt;/h3&gt; &lt;script class="brush: plain" type="syntaxhighlighter"&gt;&lt;br /&gt;#Id,FirtsName,LastName&lt;br /&gt;1,Costas,Bakopanos&lt;br /&gt;2,Bill,Gates&lt;br /&gt;&lt;/script&gt;  &lt;h3&gt;Imperative approach for parsing a csv file&lt;/h3&gt; &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;var customers = new List&lt;Customer&gt;();&lt;br /&gt;foreach (string customerLine in File.ReadAllLines("customer.csv"))&lt;br /&gt;{&lt;br /&gt;    if (customerLine.StartsWith("#"))&lt;br /&gt;    {&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    string[] data = customerLine.Split(',');&lt;br /&gt;    var customer = new Customer&lt;br /&gt;    {&lt;br /&gt;        Id = Convert.ToInt32(data[0]),&lt;br /&gt;        FirstName = data[1],&lt;br /&gt;        LastName = data[2]&lt;br /&gt;    };&lt;br /&gt;    customers.Add(customer);&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;  &lt;h3&gt;Declarative approach for parsing a csv file&lt;/h3&gt;  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;var customers =&lt;br /&gt;    from customerLine in File.ReadAllLines("customer.csv")&lt;br /&gt;    where !customerLine.StartsWith("#")&lt;br /&gt;    select customerLine.Split(',')&lt;br /&gt;    into data&lt;br /&gt;    select new Customer&lt;br /&gt;                {&lt;br /&gt;                    Id = Convert.ToInt32(data[0]),&lt;br /&gt;                    FirstName = data[1],&lt;br /&gt;                    LastName = data[2]&lt;br /&gt;                };&lt;br /&gt;&lt;/script&gt;  &lt;h3&gt;Declarative approach for parsing a csv file, a more concise style&lt;/h3&gt;  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;var customers =&lt;br /&gt;    from custumerLine in File.ReadAllLines("customer.csv")&lt;br /&gt;    where !custumerLine.StartsWith("#")&lt;br /&gt;    let data = custumerLine.Split(',')&lt;br /&gt;    select new Customer&lt;br /&gt;                {&lt;br /&gt;                    Id = Convert.ToInt32(data[0]),&lt;br /&gt;                    FirstName = data[1],&lt;br /&gt;                    LastName = data[2]&lt;br /&gt;                };&lt;br /&gt;&lt;/script&gt;  &lt;h3&gt;Streaming approach to save resources&lt;/h3&gt; When dealling with large files, better stream than read to end in order to reduce the memory used by your application. &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;IEnumerable&lt;Customer&gt; customers;&lt;br /&gt;using (var reader = new StreamReader("customer.csv"))&lt;br /&gt;{&lt;br /&gt;    customers = (from customerLine in reader.Lines()&lt;br /&gt;                    where !customerLine.StartsWith("#")&lt;br /&gt;                    let data = customerLine.Split(',')&lt;br /&gt;                    select new Customer&lt;br /&gt;                            {&lt;br /&gt;                                Id = Convert.ToInt32(data[0]),&lt;br /&gt;                                FirstName = data[1],&lt;br /&gt;                                LastName = data[2]&lt;br /&gt;                            }).ToList();//&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;  &lt;h3&gt;Lines extension method&lt;/h3&gt; The following extension method (used previously) returns an IEnumerable reader. &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;public static class StreamReaderEnumerable&lt;br /&gt;{&lt;br /&gt;    public static IEnumerable&lt;string&gt; Lines(this StreamReader source)&lt;br /&gt;    {&lt;br /&gt;        string line;&lt;br /&gt;        while ((line = source.ReadLine()) != null)&lt;br /&gt;        {&lt;br /&gt;            yield return line;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-6618907834265590217?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3KmuMnVIB2mJVxQSDuWnBQsgO4I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3KmuMnVIB2mJVxQSDuWnBQsgO4I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3KmuMnVIB2mJVxQSDuWnBQsgO4I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3KmuMnVIB2mJVxQSDuWnBQsgO4I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/fkfKsgCE2jQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/6618907834265590217/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/09/functional-construction-pattern-parsing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/6618907834265590217?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/6618907834265590217?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/fkfKsgCE2jQ/functional-construction-pattern-parsing.html" title="Functional Construction Pattern: Parsing a csv file." /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/09/functional-construction-pattern-parsing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EBRXk6eyp7ImA9Wx5XEkw.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8975474113376393134</id><published>2010-09-10T22:47:00.005+02:00</published><updated>2010-09-11T16:34:14.713+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-11T16:34:14.713+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>The 5 minute Dependency Injection Container</title><content type="html">In order to decouple dependent components you have to make sure that the consumer component that depends on a service component doesn't need to create the service component. &lt;br&gt; &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://4.bp.blogspot.com/_UqpPEshhhrk/TItibxGjjjI/AAAAAAAAAMA/-bChLdC1lzM/s1600/DeploymentDiagram.gif" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TItibxGjjjI/AAAAAAAAAMA/-bChLdC1lzM/s200/DeploymentDiagram.gif" width="141" height="200"&gt;&lt;/a&gt;&lt;/div&gt;This pattern is called &lt;a href="http://martinfowler.com/articles/injection.html"&gt;Dependency Injection&lt;/a&gt; (Martin Fowler).&lt;br&gt; &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://1.bp.blogspot.com/_UqpPEshhhrk/TItsfJNPb3I/AAAAAAAAAMI/cYvESdzRBpQ/s1600/DeploymentDiagram.gif" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UqpPEshhhrk/TItsfJNPb3I/AAAAAAAAAMI/cYvESdzRBpQ/s320/DeploymentDiagram.gif"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;There are many DI frameworks available: &lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt;, &lt;a href="http://www.springframework.net/"&gt;Spring.NET&lt;/a&gt;, &lt;a href="http://structuremap.github.com/structuremap/index.html"&gt;Structuremap&lt;/a&gt;, &lt;a href="http://unity.codeplex.com/"&gt;Unity Application Block&lt;/a&gt; (Unity), &lt;a href="http://mef.codeplex.com/"&gt;Managed Extensibility Framework&lt;/a&gt; (MEF). &lt;i&gt;&lt;b&gt;It's not worth to worry about creating your own.&lt;/b&gt;&lt;/i&gt; However if you build a simple app and you need something light and simple, or &lt;b&gt;&lt;i&gt;if you just want to understand the concept of DI without the overhead of having to learn an API&lt;/i&gt;&lt;/b&gt; then you can use the following simple container to do some DI.  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;public class LightContainer&lt;br /&gt;{&lt;br /&gt;	private readonly Dictionary&lt;Type, object&gt; _catalog = new Dictionary&lt;Type, object&gt;();&lt;br /&gt; &lt;br /&gt;	private readonly Dictionary&lt;Type, bool&gt; _catalogIndex = new Dictionary&lt;Type, bool&gt;();&lt;br /&gt; &lt;br /&gt;	public void Register&lt;T&gt;(Func&lt;T&gt; f)&lt;br /&gt;	{&lt;br /&gt;		if (_catalog.ContainsKey(typeof(T)))&lt;br /&gt;		{&lt;br /&gt;			_catalog.Remove(typeof(T));&lt;br /&gt;		}&lt;br /&gt;		_catalogIndex.Add(typeof(T), false);&lt;br /&gt;		_catalog.Add(typeof(T), f);&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	public T Resolve&lt;T&gt;()&lt;br /&gt;	{&lt;br /&gt;		//if this is the 1st time the instance is being resolved&lt;br /&gt;		//then resolve and register again in order to improove performance&lt;br /&gt;		//if you try to resolve some type that hasen't being registered&lt;br /&gt;		//then you get an exception... this is normal!&lt;br /&gt;		if (_catalogIndex[typeof(T)] == false)&lt;br /&gt;		{&lt;br /&gt;			_catalogIndex[typeof(T)] = true;&lt;br /&gt;			_catalog[typeof(T)] = ((Func&lt;T&gt;)_catalog[typeof(T)])();&lt;br /&gt;		}&lt;br /&gt;		return (T)_catalog[typeof(T)];&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt; The LightContainer has many limitations: supports only singletons, doesn't support named instances and doesn't inject dependencies automatically using typically reflection like the "good" libraries do. On the other hand it's simple to understand and thus it's easy to extend. In addition it's very fast since reflection is not necessary. &lt;br&gt; &lt;h3&gt;How to use it&lt;/h3&gt;Assume we have the following view-viewmodel and we'd like to wire them up using Dependency Injection.  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;public class View&lt;br /&gt;{&lt;br /&gt;	public View(ILogger logger){ }&lt;br /&gt;}&lt;br /&gt;public class ViewModel&lt;br /&gt;{&lt;br /&gt;	public ViewModel(ILogger logger,View view){}&lt;br /&gt;}&lt;br /&gt;public interface ILogger&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public class Logger : ILogger &lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt; The first thing we need is an instance of the container.  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;LightContainer container= new LightContainer();&lt;br /&gt;&lt;/script&gt; Then we need to register the lambdas that can create our services. Note that the sequence of the registration is not important.  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;container.Register&lt;ILogger&gt;(() =&gt; new Logger());&lt;br /&gt;container.Register&lt;View&gt;(() =&gt; new View(container.Resolve&lt;ILogger&gt;(), container.Resolve&lt;ViewModel&gt;()));&lt;br /&gt;container.Register&lt;ViewModel&gt;(() =&gt; new ViewModel(container.Resolve&lt;ILogger&gt;()));&lt;br /&gt;&lt;/script&gt; Now when we need an service instance, say a View, we simply resolve it from the container.  &lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;&lt;br /&gt;var view = container.Resolve&lt;View&gt;();&lt;br /&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8975474113376393134?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oxMgM2XZkHh5_0VHQIqE7H4cA-8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oxMgM2XZkHh5_0VHQIqE7H4cA-8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oxMgM2XZkHh5_0VHQIqE7H4cA-8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oxMgM2XZkHh5_0VHQIqE7H4cA-8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/wrK9ywWJB9Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8975474113376393134/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/09/5-minute-dependency-injection-container.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8975474113376393134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8975474113376393134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/wrK9ywWJB9Q/5-minute-dependency-injection-container.html" title="The 5 minute Dependency Injection Container" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_UqpPEshhhrk/TItibxGjjjI/AAAAAAAAAMA/-bChLdC1lzM/s72-c/DeploymentDiagram.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/09/5-minute-dependency-injection-container.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08FQnc7fyp7ImA9Wx5RGUk.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5961385967732093553</id><published>2010-08-27T22:13:00.003+02:00</published><updated>2010-08-27T23:50:13.907+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-27T23:50:13.907+02:00</app:edited><title>Modify your build process tutorial</title><content type="html">A visual studio project is an MSBuild script. If you would like to modify the project file use any xml or text editor.&lt;br /&gt;
You need to unload the project before you modify it...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THgcQD-0_1I/AAAAAAAAAKg/n1f590eDtbc/s1600-h/unload%20project%5B6%5D.jpg"&gt;&lt;img alt="unload project" border="0" height="237" src="http://lh6.ggpht.com/_UqpPEshhhrk/THgcRrznCEI/AAAAAAAAAKk/zHdan_hG1sU/unload%20project_thumb%5B4%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="unload project" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
… make modifications and then reloaded it again…&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/THgcSztMwlI/AAAAAAAAAKw/BJS4F9e2HEo/s1600-h/reload%20project%5B6%5D.jpg"&gt;&lt;img alt="reload project" border="0" height="111" src="http://lh4.ggpht.com/_UqpPEshhhrk/THgcT6Mw6eI/AAAAAAAAAK0/LSHCh9EG_SQ/reload%20project_thumb%5B4%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="reload project" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;h3&gt;Don’t do this…&lt;/h3&gt;You will find the following lines inside any visual studio project&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/THgcU8q_3MI/AAAAAAAAAK8/PHX0U4zDAQk/s1600-h/modify%20comments%5B4%5D.jpg"&gt;&lt;img alt="modify comments" border="0" height="53" src="http://lh6.ggpht.com/_UqpPEshhhrk/THgcWOoNkOI/AAAAAAAAALE/lbZkAexFl9U/modify%20comments_thumb%5B2%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="modify comments" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
…don’t do this. You are better off making minimal changes in the project files. If you write your custom scripts inside seperate files then it's easier to share the msbuild code among your projects. &lt;br /&gt;
&lt;h3&gt;Organizing your msbuild files&lt;/h3&gt;Typically visual studio has reserved the *proj suffix for it’s own files. &lt;br /&gt;
&lt;table border="0" cellpadding="2" cellspacing="0" style="width: 200px;"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;c#&lt;/td&gt; &lt;td valign="top" width="100"&gt;csproj&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;visual basic&lt;/td&gt; &lt;td valign="top" width="100"&gt;vbproj&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;c++&lt;/td&gt; &lt;td valign="top" width="100"&gt;vcproj&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;lightswitch&lt;/td&gt; &lt;td valign="top" width="100"&gt;lsproj&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;vs deployment&lt;/td&gt; &lt;td valign="top" width="100"&gt;vdproj&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="100"&gt;&lt;/td&gt; &lt;td valign="top" width="100"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Unless you are creating a new visual studio project template don’t use a *proj suffixed file name. A good recomentation for msbuild filenames is the one that microsoft is using. Take a look inside the “C:\Windows\Microsoft.NET\Framework\v4.0.30319”. You will find some msbuild files there suffixed with *.tasks and *.targets&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="2" cellspacing="0" style="width: 400px;"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.Common.Tasks&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.Common.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.CSharp.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.Data.Entity.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.NETFramework.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.VisualBasic.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;Microsoft.WinFx.targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;*.Tasks files have only references to dlls with msbuild tasks  &lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THgcXTIwFyI/AAAAAAAAALI/DZ1oFx1z0Zc/s1600-h/tasks%20file%5B8%5D.jpg"&gt;&lt;img alt="tasks file" border="0" height="55" src="http://lh6.ggpht.com/_UqpPEshhhrk/THgcYgpnbeI/AAAAAAAAALQ/uBV19sXblAA/tasks%20file_thumb%5B6%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="tasks file" width="244" /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
*.Targets files have all the code (msbuild scripts)&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THgcZwZplJI/AAAAAAAAALY/crv4I9iZOKw/s1600-h/targets%20file%5B4%5D.jpg"&gt;&lt;img alt="targets file" border="0" height="136" src="http://lh5.ggpht.com/_UqpPEshhhrk/THgcbS8HFvI/AAAAAAAAALg/i3bCaaQxQK8/targets%20file_thumb%5B2%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="targets file" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;h3&gt;Creating custom msbuild files for your VS projects&lt;/h3&gt;Create 2 msbuild files with a text editor, or even in visual studio (add new xml file).&lt;br /&gt;
Example names: My.Tasks &amp;amp; My.Targets&lt;br /&gt;
&lt;br /&gt;
Inside the *.tasks file you reference the necessary tasks&lt;br /&gt;
&lt;script class="brush: xml;toolbar: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;usingtask TaskName="CheckProjectReferences" AssemblyFile="$(SolutionDir)\ArchiCop.dll"/&gt;
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
You need to import the *.tasks file insode the targets file   &lt;script class="brush: xml;toolbar: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;import Project="My.targets" /&gt;
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;h3&gt;BuildDependsOn PropertGroup &lt;/h3&gt;&lt;script class="brush: xml;toolbar: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt; 

&lt;propertygroup&gt;
&lt;builddependson&gt;
ArchiCop;
$(BuildDependsOn);
&lt;/BuildDependsOn&gt;
&lt;/PropertyGroup&gt; 

&lt;target Name="ArchiCop"&gt;
&lt;!—something here --&gt;
&lt;/Target&gt; 

&lt;/Project&gt;
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
The BuildDependsOn propertgroup overrides the BuildDependsOn of the visual studio build process. You can do here all you need. It’s much better than doing it inside the BeforeBuild and AfterBuild targets of the visual studio project file.&lt;br /&gt;
The only thing that is left now is to actually import the msbuild script inside the project file. In the following example I make the assumption that my msbuild scripts reside in the same directory as my solution.&lt;br /&gt;
&lt;script class="brush: xml;toolbar: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /&gt;
&lt;import Project="$(SolutionDir)\My.targets" /&gt; 
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
&lt;h3&gt;Usefull property groups&lt;/h3&gt;&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THgccVpQJfI/AAAAAAAAALo/udtQOtM9AdE/s1600-h/propgroups%5B8%5D.jpg"&gt;&lt;img alt="propgroups" border="0" height="148" src="http://lh3.ggpht.com/_UqpPEshhhrk/THgcdidc-dI/AAAAAAAAALs/SCQCSOOyPNc/propgroups_thumb%5B6%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="propgroups" width="244" /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
Take a look at your project properties –&amp;gt; build events for nice examples of property groups that are already defined in the default build process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5961385967732093553?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DoKEA-G94naAR6ql_ABTXzAwUxE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DoKEA-G94naAR6ql_ABTXzAwUxE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DoKEA-G94naAR6ql_ABTXzAwUxE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DoKEA-G94naAR6ql_ABTXzAwUxE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/4WW5EhZRWDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5961385967732093553/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/08/modify-your-build-process-tutorial.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5961385967732093553?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5961385967732093553?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/4WW5EhZRWDQ/modify-your-build-process-tutorial.html" title="Modify your build process tutorial" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_UqpPEshhhrk/THgcRrznCEI/AAAAAAAAAKk/zHdan_hG1sU/s72-c/unload%20project_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/08/modify-your-build-process-tutorial.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMARHo8fip7ImA9Wx5RFUU.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-1031897292578236000</id><published>2010-08-22T22:55:00.001+02:00</published><updated>2010-08-23T20:34:05.476+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-23T20:34:05.476+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>Visual Studio LightSwitch, Beta 1 (x86) - DVD</title><content type="html">Wow!    &lt;br /&gt;
&lt;a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank"&gt;LightSwitch&lt;/a&gt; beta1 finally available for download for msdn subscribers... 507MB download, no key required.&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank"&gt;LightSwitch&lt;/a&gt; Installation&lt;/h3&gt;&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THJSYhsR8uI/AAAAAAAAAHI/JH-H3SFAA5A/s1600-h/install01%5B5%5D.jpg"&gt;&lt;img alt="install01" border="0" height="218" src="http://lh6.ggpht.com/_UqpPEshhhrk/THJSY4kc_jI/AAAAAAAAAHM/KFZ3ogDaHRo/install01_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="install01" width="244" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;
There is nothing currently to “Customize”…&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/THJSZaKnX5I/AAAAAAAAAHQ/Q8CsF6zdSow/s1600-h/install02%5B5%5D.jpg"&gt;&lt;img alt="install02" border="0" height="218" src="http://lh6.ggpht.com/_UqpPEshhhrk/THJSZrS1-wI/AAAAAAAAAHU/6SujlyLLV9k/install02_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="install02" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
… even the installation folder is fixed if you have vs2010 already installed!&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/THJSaN7s0aI/AAAAAAAAAHY/Mzvnr7Lz_GI/s1600-h/install03%5B5%5D.jpg"&gt;&lt;img alt="install03" border="0" height="218" src="http://lh6.ggpht.com/_UqpPEshhhrk/THJSadOCOzI/AAAAAAAAAHc/DvAUWF7E2ag/install03_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="install03" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
The installation process should not take that long…&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THJSa0RUjHI/AAAAAAAAAHg/wE7-vgUZ8U8/s1600-h/install04%5B5%5D.jpg"&gt;&lt;img alt="install04" border="0" height="220" src="http://lh4.ggpht.com/_UqpPEshhhrk/THJSbOqJgsI/AAAAAAAAAHk/zV9JAknkTcQ/install04_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="install04" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
… and when done you get the “funny” for a developer option to run the app:-)&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THJSbcUJMoI/AAAAAAAAAHo/o4xUtUsIHpo/s1600-h/install05%5B5%5D.jpg"&gt;&lt;img alt="install05" border="0" height="219" src="http://lh4.ggpht.com/_UqpPEshhhrk/THJSb-r-ArI/AAAAAAAAAHs/t3C4jSrTL1g/install05_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="install05" width="244" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank"&gt;LightSwitch&lt;/a&gt; first run&lt;/h3&gt;Same splash screen as vs2010, no surprise since it runs integrated.&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THJScIzmnaI/AAAAAAAAAHw/gPwQYnLSxF0/s1600-h/run01%5B5%5D.jpg"&gt;&lt;img alt="run01" border="0" height="170" src="http://lh3.ggpht.com/_UqpPEshhhrk/THJScaGrjjI/AAAAAAAAAH0/RSPx59se99I/run01_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run01" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
Under the LightSwitch templates you can choose your preferred programming language.&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/THJSc-96W3I/AAAAAAAAAH4/bOMzZ22-ZmI/s1600-h/run03%5B5%5D.jpg"&gt;&lt;img alt="run03" border="0" height="141" src="http://lh3.ggpht.com/_UqpPEshhhrk/THJSdYpHqyI/AAAAAAAAAH8/7zxX_CmPuTE/run03_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run03" width="244" /&gt;&lt;/a&gt;&lt;br /&gt;
LightSwitch is truly data driven so the first thing&amp;nbsp; that you need to take care of is connect to some data. For those of us you like to think objects first this might be a bit of frustrating!&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/THJSduTXaYI/AAAAAAAAAIA/izAWuV3T0yY/s1600-h/run02%5B5%5D.jpg"&gt;&lt;img alt="run02" border="0" height="87" src="http://lh5.ggpht.com/_UqpPEshhhrk/THJSd9ZfEhI/AAAAAAAAAIE/uVJPX_BNZEY/run02_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run02" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
Let’s create a new table, a “Customer” table. Use singular case here. why? Well behind the scenes there must be entity framework somewhere! &lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/THJSeNyI6MI/AAAAAAAAAII/ZEBQye0NjRE/s1600-h/run04%5B5%5D.jpg"&gt;&lt;img alt="run04" border="0" height="67" src="http://lh4.ggpht.com/_UqpPEshhhrk/THJSegpTlFI/AAAAAAAAAIM/tKpfOjNzMpM/run04_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run04" width="244" /&gt;&lt;/a&gt;&lt;br /&gt;
OK, we’ve got data now let’s make a screen to enter new records. &lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THJSfP0CJtI/AAAAAAAAAIQ/GmefHz3Zvo8/s1600-h/run05%5B5%5D.jpg"&gt;&lt;img alt="run05" border="0" height="208" src="http://lh5.ggpht.com/_UqpPEshhhrk/THJSfmWkDAI/AAAAAAAAAIU/5_7uJfQ38dI/run05_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run05" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
There is a hand full of commonly used data driven screen templates. Let’s hope there will be a possibility to extend these.&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/THJSf4rJwMI/AAAAAAAAAIY/ASSe8l5T20c/s1600-h/run06%5B5%5D.jpg"&gt;&lt;img alt="run06" border="0" height="176" src="http://lh5.ggpht.com/_UqpPEshhhrk/THJSgUqx1NI/AAAAAAAAAIc/QAxyF-9MuVk/run06_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run06" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
The user interface designer look pretty much like the good old Oracle Forms designer looked… only it’s much nicer:-) I hope there is a possibility to alter the wpf styles behind the scenes…&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THJSguL0GRI/AAAAAAAAAIg/-qNSFV1_8mY/s1600-h/run07%5B5%5D.jpg"&gt;&lt;img alt="run07" border="0" height="196" src="http://lh3.ggpht.com/_UqpPEshhhrk/THJShG6ko9I/AAAAAAAAAIk/TRgECZxF2Ig/run07_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run07" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
So let’s start the app hitting F5 =&amp;gt;&lt;br /&gt;
You get the lightswitch wcf server host up and running…&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/THJShuWXzNI/AAAAAAAAAIo/xMQq7G3pT_8/s1600-h/run08%5B5%5D.jpg"&gt;&lt;img alt="run08" border="0" height="142" src="http://lh6.ggpht.com/_UqpPEshhhrk/THJSiHvj37I/AAAAAAAAAIs/qWobqulgQNI/run08_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run08" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
And this is how our first app looks like… not bad for the amount of work that we have invested.&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THJSiR7WVbI/AAAAAAAAAIw/BY_y5quX0F4/s1600-h/run09%5B5%5D.jpg"&gt;&lt;img alt="run09" border="0" height="192" src="http://lh4.ggpht.com/_UqpPEshhhrk/THJSiwXK0AI/AAAAAAAAAI0/zTGx6cMz3aQ/run09_thumb%5B1%5D.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="run09" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;h3&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank"&gt;LightSwitch&lt;/a&gt; first thoughts &lt;/h3&gt;&lt;ul&gt;&lt;li&gt;I took a quick look at the solution folder and I was very surprised: the simple app we created before needs over 70MB in disk!!! &lt;/li&gt;
&lt;li&gt;The project files are of course MsBuild project files like all other visual studio projects. They have reserved the *.lsproj extension. &lt;/li&gt;
&lt;li&gt;The structure of the solution needs some studying, it’s not what you would expect for any other project. &lt;/li&gt;
&lt;li&gt;Is MS Access dead? If I wanted to do something with access I would definitely consider LightSwitch. &lt;/li&gt;
&lt;li&gt;Integration with source controls (at least SVN, HG and TFS) seems to be ok. &lt;/li&gt;
&lt;li&gt;Would the LightSwitch environment support a large team? I am a bit skeptical here. &lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-1031897292578236000?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/58zGLmxNN21uf8voSfwzbR0tmFY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/58zGLmxNN21uf8voSfwzbR0tmFY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/58zGLmxNN21uf8voSfwzbR0tmFY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/58zGLmxNN21uf8voSfwzbR0tmFY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/N8NE8eOrDW4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/1031897292578236000/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/08/visual-studio-lightswitch-beta-1-x86.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1031897292578236000?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1031897292578236000?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/N8NE8eOrDW4/visual-studio-lightswitch-beta-1-x86.html" title="Visual Studio LightSwitch, Beta 1 (x86) - DVD" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_UqpPEshhhrk/THJSY4kc_jI/AAAAAAAAAHM/KFZ3ogDaHRo/s72-c/install01_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/08/visual-studio-lightswitch-beta-1-x86.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcDRHs6fCp7ImA9Wx5RFUs.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-6848807118601473652</id><published>2010-08-19T23:44:00.001+02:00</published><updated>2010-08-23T14:37:55.514+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-23T14:37:55.514+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity" /><title>ASPNETPORTAL now on teamcity.codebetter.com</title><content type="html">&lt;p&gt;Many thanks to &lt;a href="http://codebetter.com/blogs/kyle.baley/archive/2010/02/10/codebetter-ci-server-update-or-how-to-plead-your-case.aspx" target="_blank"&gt;Kyle Baley - The Coding Hillbilly&lt;/a&gt; for providing a free build server for the &lt;a href="http://aspnetportal.codeplex.com/" target="_blank"&gt;asp net portal starter kit&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Link to the build server: &lt;a title="http://teamcity.codebetter.com/login.html" href="http://teamcity.codebetter.com/login.html"&gt;http://teamcity.codebetter.com/login.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In order to register and build your own open source project there you need to sent an email to &lt;a href="mailto:kyle@baley.org"&gt;kyle@baley.org&lt;/a&gt; with your project information. As an example for the &lt;a href="http://aspnetportal.codeplex.com" target="_blank"&gt;aspnet portal&lt;/a&gt; I have sent the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Username on the TeamCity server, you simply need to click register new account at the &lt;a title="http://teamcity.codebetter.com/login.html" href="http://teamcity.codebetter.com/login.html"&gt;http://teamcity.codebetter.com/login.html&lt;/a&gt;       &lt;br /&gt;&lt;strong&gt;cbakopanos&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Usernames of any other people you’d like to be administrators of the build      &lt;br /&gt;&lt;strong&gt;n/a&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;The name of the project      &lt;br /&gt;&lt;strong&gt;ASPNETPORTAL&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;A *brief* description      &lt;br /&gt;&lt;strong&gt;The ASPNETPortal Starter Kit demonstrates how you can use &lt;/strong&gt;&lt;a href="http://ASP.NET"&gt;&lt;strong&gt;ASP.NET&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; and the .NET Framework to build a dynamic portal application.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;The project’s URL      &lt;br /&gt;&lt;a href="http://aspnetportal.codeplex.com"&gt;&lt;strong&gt;http://aspnetportal.codeplex.com&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;The URL to the source code, better use the subversion uri if you are hosted in codeplex and use tfs because the svnbridge uri supports anonymous auth.      &lt;br /&gt;&lt;a href="https://ASPNETPortal.svn.codeplex.com/svn"&gt;&lt;strong&gt;https://ASPNETPortal.svn.codeplex.com/svn&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;The name of the build runner (e.g. NAnt, Rake, MSBuild, command line, etc.)      &lt;br /&gt;&lt;strong&gt;MSBuild&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;The path to the build file (relative to the source code URL above)      &lt;br /&gt;&lt;strong&gt;build.proj&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Any other details required by the build runner (e.g. the name of the target if different from the default)      &lt;br /&gt;&lt;strong&gt;run the build target&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In my case I got a reply in less than 24 hours! Wow! I got a new project created for me with one build configuration.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/THJrBoyAfPI/AAAAAAAAAI4/q99UweDGwjs/s1600-h/teamcity_codebetter%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="teamcity_codebetter" border="0" alt="teamcity_codebetter" src="http://lh5.ggpht.com/_UqpPEshhhrk/THJrCMhmV2I/AAAAAAAAAI8/CISnA9Mi-R0/teamcity_codebetter_thumb.jpg?imgmax=800" width="244" height="126" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Tip: The first thing you would like to do is click the link in the upper left corner “Configure visible projects” and make visible ONLY your project. Otherwise it takes for ever to load the initial home screen.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Another thing that you would like to probably do is see the revision number on the build. The picture above for example shows #rev: 49859. The default you will get is an automatically incremented build number per configuration 1,2,3,4,… You can do this by simply specifying in the general settings of your configuration the special build number format that teamcity understands.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_UqpPEshhhrk/THJrCbBawXI/AAAAAAAAAJA/CIzjiU5doaY/s1600-h/settings_teamcity%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="settings_teamcity" border="0" alt="settings_teamcity" src="http://lh6.ggpht.com/_UqpPEshhhrk/THJrClDlchI/AAAAAAAAAJE/JnGdEtD15QE/settings_teamcity_thumb%5B2%5D.jpg?imgmax=800" width="244" height="74" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Please note that ASPNETPortal_SVN in the above format refers to the vcs root of my project. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_UqpPEshhhrk/THJrC35qddI/AAAAAAAAAJI/l_nJkW0BA3Q/s1600-h/vcs%20root%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="vcs root" border="0" alt="vcs root" src="http://lh3.ggpht.com/_UqpPEshhhrk/THJrDdIT9QI/AAAAAAAAAJM/riNWnNTqmMg/vcs%20root_thumb.jpg?imgmax=800" width="244" height="32" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If your name has any spaces, dots or any other special chars then you have to replace them inside the format string with underscores. In other words you are better off giving your vcs root a “code friendly” name:-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-6848807118601473652?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bUL95_7pg2E73SFfv3hwgRhZxQg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bUL95_7pg2E73SFfv3hwgRhZxQg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bUL95_7pg2E73SFfv3hwgRhZxQg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bUL95_7pg2E73SFfv3hwgRhZxQg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/bDkKi7vFK2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/6848807118601473652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/08/aspnetportal-now-on-teamcitycodebetterc.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/6848807118601473652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/6848807118601473652?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/bDkKi7vFK2s/aspnetportal-now-on-teamcitycodebetterc.html" title="ASPNETPORTAL now on teamcity.codebetter.com" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_UqpPEshhhrk/THJrCMhmV2I/AAAAAAAAAI8/CISnA9Mi-R0/s72-c/teamcity_codebetter_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/08/aspnetportal-now-on-teamcitycodebetterc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUBR306eip7ImA9Wx5REkk.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-4338820194974009139</id><published>2010-08-19T14:16:00.002+02:00</published><updated>2010-08-19T21:47:36.312+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-19T21:47:36.312+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SUBVERSION" /><title>Working on a private remote branch</title><content type="html">The terminology used here is deriving from subversion but the concept is applicable to most source controls.&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;Most common scenario:        &lt;br /&gt;
&lt;/b&gt;Checkout the sources from a “remote branch” into your “local copy”. Continue working there until you reach a point were your changes are good enough to be committed. In order not to deviate too much from the remote branch you often update your local copy.&lt;/blockquote&gt;&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/TG0gpzDWgBI/AAAAAAAAAGg/AIVMfblDDoc/s1600-h/image%5B25%5D.png"&gt;&lt;img alt="image" border="0" height="94" src="http://lh3.ggpht.com/_UqpPEshhhrk/TG0gqcKcDXI/AAAAAAAAAGk/UIk2t0jTCmc/image_thumb%5B19%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="244" /&gt;&lt;/a&gt; &lt;br /&gt;
PROS &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Easy to understand. &lt;/li&gt;
&lt;li&gt;No overhead in smaller projects. &lt;/li&gt;
&lt;/ul&gt;CONS&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Cannot commit sometimes for days. Especially in bigger teams the cost of breaking the remote branch can be very high. &lt;/li&gt;
&lt;li&gt;Cannot go back in time in your local work. If you mess up half way through your implementation then there is no safe point… No one is controlling your local history. &lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;b&gt;Private Remote Branch:      &lt;br /&gt;
&lt;/b&gt;Create a branch for your self only “private branch”. Checkout the sources from the “private branch” into your local copy. Frequently commit your changes into the “private branch”, even if you have not yet reached a point were your changes are good enough to be committed into the “team branch”. In order not to deviate too much from the “team branch” often merge changes into your “private branch”. When you are ready to commit to the “team branch” simply switch your local copy to that branch, stabilize and commit.&lt;/blockquote&gt;&lt;a href="http://lh3.ggpht.com/_UqpPEshhhrk/TG0gqtkfNAI/AAAAAAAAAGo/wRrXUWi6aPE/s1600-h/image%5B24%5D.png"&gt;&lt;img alt="image" border="0" height="126" src="http://lh6.ggpht.com/_UqpPEshhhrk/TG0grBjY1SI/AAAAAAAAAGw/ykXH_fiVsBw/image_thumb%5B18%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="244" /&gt;&lt;/a&gt;&lt;br /&gt;
PROS&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;You can go back in history for all local work since you can afford to commit any time you like. &lt;/li&gt;
&lt;li&gt;Once you grasp this concept you will typically make less and better commits to the team branch with better and more meaning full comments. &lt;/li&gt;
&lt;li&gt;If necessary you can build your interim work in the build server or even share it with a co developer for reviewing. &lt;/li&gt;
&lt;li&gt;The merging from the “team branch” to your “private branch” is really easy… basically equal to updating a local copy (since you are the only contributor to the “private branch”).&lt;/li&gt;
&lt;/ul&gt;CONS&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Overhead for a small project &lt;/li&gt;
&lt;li&gt;More difficult to understand &lt;/li&gt;
&lt;li&gt;Some source controls have shelving facilities. Example in TFS you can shelve your changes. This is not exactly equal to what has being described above (in TFS you shelve a state of your workspace with a name), but in most cases is more than enough. &lt;/li&gt;
&lt;li&gt;Distributed source controls support private branches locally (you can locally commit). Again this is not exactly equal to the picture above (what if I loose my notebook?) but it is in most cases more than enough! &lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-4338820194974009139?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pJDTyB0iyysBhA_Nf54bGt9WRgg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pJDTyB0iyysBhA_Nf54bGt9WRgg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pJDTyB0iyysBhA_Nf54bGt9WRgg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pJDTyB0iyysBhA_Nf54bGt9WRgg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/HDYsxDCyx4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/4338820194974009139/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/08/working-on-private-remote-branch.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4338820194974009139?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4338820194974009139?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/HDYsxDCyx4U/working-on-private-remote-branch.html" title="Working on a private remote branch" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_UqpPEshhhrk/TG0gqcKcDXI/AAAAAAAAAGk/UIk2t0jTCmc/s72-c/image_thumb%5B19%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/08/working-on-private-remote-branch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YBQXc5fip7ImA9Wx5REk8.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-1985891986944137943</id><published>2010-08-18T16:42:00.001+02:00</published><updated>2010-08-19T14:32:30.926+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-19T14:32:30.926+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SUBVERSION" /><title>Create a new Subversion Repository</title><content type="html">&lt;div style="text-align: left"&gt;Create a repository by right clicking inside the new repository empty folder.&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoMDUducI/AAAAAAAAAFQ/6Zx91wNIlTk/s1600/create_repo.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoMDUducI/AAAAAAAAAFQ/6Zx91wNIlTk/s320/create_repo.JPG" width="320" height="185" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;You can access your repository using the repo browser. Right click anywhere in the windows explorer to open the repo browser.&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoOzp3ByI/AAAAAAAAAFY/W4qKLD8OW7Y/s1600/repo_browser_1.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoOzp3ByI/AAAAAAAAAFY/W4qKLD8OW7Y/s320/repo_browser_1.JPG" width="320" height="187" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;Provide a valid Uri. If the new repository was created inside c:\test\MyRepo, then the Uri would be file:///c:\test\MyRepo&lt;/div&gt;  &lt;div style="text-align: left"&gt;Notice the extra escape forward slash in the Uri.&lt;/div&gt;  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoQfY1sNI/AAAAAAAAAFc/kjDqTfDgico/s1600/repo_browser_2.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoQfY1sNI/AAAAAAAAAFc/kjDqTfDgico/s400/repo_browser_2.JPG" width="400" height="90" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left; clear: both" class="separator"&gt;If you were using a remote repository then this Uri would be the http path to your repository. &lt;/div&gt;  &lt;div style="text-align: left; clear: both" class="separator"&gt;   &lt;br /&gt;&lt;/div&gt; The repo browser is basically the &amp;quot;windows explorer&amp;quot; of subversion. It let's you view your repos and in addition it allows basic server side operations. Note that anything you do using the repo browser is a connected operation.   &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoRlr_K_I/AAAAAAAAAFg/KCI6na2nzak/s1600/repo_browser_3.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoRlr_K_I/AAAAAAAAAFg/KCI6na2nzak/s400/repo_browser_3.JPG" width="400" height="303" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;Now let's define the top level structure for our repository. Following subversion best practices we will create at the root folder 3 sub-folders: trunk, tags, branches.&lt;/div&gt;  &lt;div style="text-align: left"&gt;You can create a new folder directly in the repo browser by right clicking at the level you would like your new folder to be created.&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://2.bp.blogspot.com/_UqpPEshhhrk/TGvoBPlntfI/AAAAAAAAAFM/hhVCH8gmIfE/s1600/create_new_folder.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_UqpPEshhhrk/TGvoBPlntfI/AAAAAAAAAFM/hhVCH8gmIfE/s320/create_new_folder.JPG" width="320" height="243" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;You need to give the new directory a name (example trunk) and also provide a meaning full comment. The creation of this folder creates basically a new revision to your repository. Make sure that you are not lazy with comments; the comment doesn't have to be long but it needs to give a clear explanation of the transaction that happened. &lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoNf8nx3I/AAAAAAAAAFU/USAnFMexNhQ/s1600/enter_log_message.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoNf8nx3I/AAAAAAAAAFU/USAnFMexNhQ/s320/enter_log_message.JPG" width="320" height="219" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;After you create all 3 top level folders your root structure should look like the following picture.&lt;/div&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoTs28F6I/AAAAAAAAAFk/PmXQGRpwvtc/s1600/top_level_structure.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_UqpPEshhhrk/TGvoTs28F6I/AAAAAAAAAFk/PmXQGRpwvtc/s1600/top_level_structure.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Trunk_%28software%29" target="_blank"&gt;trunk&lt;/a&gt;&lt;/strong&gt; is the main line of development in a SVN repository. &lt;/li&gt;    &lt;li&gt;A &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Branching_%28software%29" target="_blank"&gt;branch&lt;/a&gt;&lt;/strong&gt; is a side-line of development created to make larger, experimental or disrupting work without annoying users of the trunk version. Also, branches can be used to create development lines for multiple versions of the same product, like having a place to back port bug fixes into a stable release. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;tag&lt;/strong&gt;s are markers to highlight notable revisions in the history of the repository, usually things like &amp;quot;this was released as 1.0&amp;quot;. Please note that by convention you never alter code inside tags; you are better off revoking write access from tags to the majority of developers. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;spikes&lt;/b&gt; are similar to branches (never for stabilizing) but for less formal work. An example is that I have under branches work that I need also to build on the build server, under spikes I have usually private paths or experiments that might not even be ever merged back to the main line &amp;quot;trunk&amp;quot;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UqpPEshhhrk/TG0kXEm7EzI/AAAAAAAAAG8/aFBTj4SKPw4/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_UqpPEshhhrk/TG0kXUvDEjI/AAAAAAAAAHA/4Zctc-5PIx4/image_thumb.png?imgmax=800" width="244" height="97" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div&gt;Another top level structure for more demanding projects is the multi project repository structure. In this case the 1st level of directories contain names of projects and the second level of directories the same structure as before. This is a &amp;quot;hack&amp;quot; you can do in &lt;a href="http://subversion.apache.org/" target="_blank"&gt;Svn&lt;/a&gt; in order to kind-of-mimic a distributed repository. Note that distributed facilities are not explicitly available in &lt;a href="http://subversion.apache.org/" target="_blank"&gt;Svn&lt;/a&gt;, so you need to improvise each time you need operations such as merge, branch, etc across projects. In another source control like &lt;a href="http://git-scm.com/" target="_blank"&gt;git&lt;/a&gt;, &lt;a href="http://mercurial.selenic.com/" target="_blank"&gt;mercurial&lt;/a&gt; or &lt;a href="http://bazaar.canonical.com/en/" target="_blank"&gt;Bazaar&lt;/a&gt; this would have no meaning since any operation across repositories is by nature supported.&lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;&lt;a style="margin-bottom: 1em; clear: left" href="http://1.bp.blogspot.com/_UqpPEshhhrk/TGvwe4wxV-I/AAAAAAAAAFo/LJzj88lUbko/s1600/top_level_structure_2.JPG" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UqpPEshhhrk/TGvwe4wxV-I/AAAAAAAAAFo/LJzj88lUbko/s320/top_level_structure_2.JPG" width="239" height="320" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;My recommendation is to use the multi project repository in ANY CASE. Even if you don't needed yet... it's a win-win situation for the future. &lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-1985891986944137943?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4FFXnpT2SewTr1ezUfHNyRiJAZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4FFXnpT2SewTr1ezUfHNyRiJAZE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4FFXnpT2SewTr1ezUfHNyRiJAZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4FFXnpT2SewTr1ezUfHNyRiJAZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/JQTSk9-AIC0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/1985891986944137943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/08/create-subversion-repository.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1985891986944137943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1985891986944137943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/JQTSk9-AIC0/create-subversion-repository.html" title="Create a new Subversion Repository" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UqpPEshhhrk/TGvoMDUducI/AAAAAAAAAFQ/6Zx91wNIlTk/s72-c/create_repo.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/08/create-subversion-repository.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MCRnc5eCp7ImA9WxBVFko.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-3695407501954817027</id><published>2010-02-20T16:13:00.004+01:00</published><updated>2010-02-20T16:24:27.920+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-20T16:24:27.920+01:00</app:edited><title>NUnit Hello Test</title><content type="html">You can download NUnit from http://www.nunit.org/&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Getting started (Hello Test) !!!&lt;/span&gt;&lt;br /&gt;
Let's write our first test and run/debug it. &lt;br /&gt;
1. Create a class library in visual studio. A good convention is to suffix all your test projects with *Tests.&lt;br /&gt;
2. Add a reference to Nunit &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UqpPEshhhrk/S3_8aYgH4pI/AAAAAAAAAEw/NoF_qXV0pZc/s1600-h/addreference.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ct="true" src="http://2.bp.blogspot.com/_UqpPEshhhrk/S3_8aYgH4pI/AAAAAAAAAEw/NoF_qXV0pZc/s320/addreference.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Create a class and optionally suffix it with "Fixture". Then decorate it with the [TestFixture] attribute. &lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
using NUnit.Framework;
namespace SampleTests
{
    [TestFixture]
    public class SomeFicture
    {
    }
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
4. Create a public method, optionaly suffix it with "Test" and decorate it with the [Test] attribute.&lt;br /&gt;
&lt;script class="brush: c-sharp" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
    [TestFixture]
    public class SomeFicture
    {
        [Test]
        public void HelloTest()
        {
            Assert.True(true);
        }
    }
]]&gt;
&lt;/script&gt;&lt;br /&gt;
5. Build your class library project. &lt;br /&gt;
6. You can run/dubug the unit test directly from studio if you have any plugin such as Resharper (VERY GOOD!!!) or TestDriven.Net or any other plugging. &lt;br /&gt;
&lt;span style="font-size: large;"&gt;nunit.exe&lt;/span&gt;&lt;br /&gt;
Start nunit.exe and create a new project. Then you add "assembly" or "VS Project", both will do. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UqpPEshhhrk/S3_8vBQ7P2I/AAAAAAAAAE4/9R31tUGGE0Q/s1600-h/add.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ct="true" src="http://1.bp.blogspot.com/_UqpPEshhhrk/S3_8vBQ7P2I/AAAAAAAAAE4/9R31tUGGE0Q/s320/add.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can directly run the test from the gui provide it. &lt;br /&gt;
If you want to debugg then goto Visual studio and attach to the nunit process. Then set the desired breakpoints, kick the test you'd like from the NUnit app and you should hit your breakpoints.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UqpPEshhhrk/S3_81e-2I6I/AAAAAAAAAFA/Zv2cUq8yCbw/s1600-h/run.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ct="true" src="http://1.bp.blogspot.com/_UqpPEshhhrk/S3_81e-2I6I/AAAAAAAAAFA/Zv2cUq8yCbw/s320/run.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;nunit-console.exe&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: plain" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
C:\temp\NUnitSample\NUnitSample\bin\Release&gt;"C:\Program Files\NUnit 2.5.3\bin\net-2.0\nunit-console.exe" NUnitSample.dll
NUnit version 2.5.3.9345
Copyright (C) 2002-2009 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.

Runtime Environment -
   OS Version: Microsoft Windows NT 6.1.7600.0
  CLR Version: 2.0.50727.4927 ( Net 2.0.50727.4927 )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: net-2.0.50727.4927
.
Tests run: 1, Errors: 0, Failures: 0, Inconclusive: 0, Time: 0.0440025 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;MSBuild&lt;/span&gt;&lt;br /&gt;
The easiest way is to use some 3rd party msbuild task such as the http://msbuildtasks.tigris.org/&lt;br /&gt;
In order to use the tasks in this project, you need to import the MSBuild.Community.Tasks.Targets files. If you installed the project with the msi installer, you can use the following.&lt;br /&gt;
&lt;script class="brush: xml" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/&gt;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
You can find info on msbuild at http://msbuildtasks.com/default.aspx&lt;br /&gt;
The task to call for NUnit is the following&lt;br /&gt;
&lt;script class="brush: xml" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
&lt;propertygroup&gt;
 &lt;bin-ToolPath&gt;c:\temp\NUnitSample\bin\debug&lt;/NUnit-ToolPath&gt;
&lt;/PropertyGroup&gt;
&lt;propertygroup&gt;
 &lt;NUnit-ToolPath&gt;C:\Program Files\NUnit 2.5.3\bin\net-2.0&lt;/NUnit-ToolPath&gt;
&lt;/PropertyGroup&gt;

&lt;nunit 
 Assemblies="$(bin-ToolPath)\NUnitSample.dll" 
 ToolPath="$(NUnit-ToolPath)" 
 DisableShadowCopy="true"
/&gt;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
Save the xml file, let's assume you name it NUnitSample.proj and call it from MSBuild&lt;br /&gt;
&lt;script class="brush: plain" type="syntaxhighlighter"&gt;
&lt;![CDATA[ 
msbuild.exe NUnitSample.proj
]]&gt;
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-3695407501954817027?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oWLVLnUX-OksPLUSDqxCIwlsJSI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oWLVLnUX-OksPLUSDqxCIwlsJSI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oWLVLnUX-OksPLUSDqxCIwlsJSI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oWLVLnUX-OksPLUSDqxCIwlsJSI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/xzO4LtwhzBo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/3695407501954817027/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2010/02/you-can-download-nunit-from-httpwww.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/3695407501954817027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/3695407501954817027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/xzO4LtwhzBo/you-can-download-nunit-from-httpwww.html" title="NUnit Hello Test" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_UqpPEshhhrk/S3_8aYgH4pI/AAAAAAAAAEw/NoF_qXV0pZc/s72-c/addreference.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2010/02/you-can-download-nunit-from-httpwww.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYEQH85fSp7ImA9WxBRF00.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-5606435919145954183</id><published>2009-12-06T18:35:00.005+01:00</published><updated>2010-01-05T16:41:41.125+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T16:41:41.125+01:00</app:edited><title>ArchitectureSamples-FunqUnity in C#4.0</title><content type="html">&lt;a href="http://www.deaddevssociety.com/2009/12/i-have-posted-very-nice-sample.html" style="display:none" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;br /&gt;
I have posted a very nice sample application on my googlecode:&lt;br /&gt;
&lt;a href="http://bakopanos.googlecode.com/svn/trunk/architecturesamples/FunqUnity"&gt;ArchitectureSamples-FunqUnity&lt;/a&gt;&lt;br /&gt;
You can checkout the code with tortoise. You need VS2010 Express or higher. Soon I will post a sibling to this sample also in VB.NET. All necessary binaries: Unity, NUnit and RhinoMocks are committed with the sample for your convenience.&lt;br /&gt;
&lt;br /&gt;
The sample application demonstrates the following architectural aspects:&lt;br /&gt;
. Domain Driven Design / Repository Pattern&lt;br /&gt;
. Modularity: Type safe registration of services &lt;br /&gt;
. Modularity: Xml registration of components&lt;br /&gt;
. Modularity: Inject xml configuration&lt;br /&gt;
. Dependency Injection&lt;br /&gt;
. Unit Tests / Mocks: isolate the repository the layer when testing the application layer&lt;br /&gt;
. Functional programming: use lambdas to isolate components in child containers&lt;br /&gt;
. Functional programming: use lambdas to isolate ADO.NET infrastructure calls (connections, commands)&lt;br /&gt;
. Functional programming: use lambdas to create a database technology factory (sqlce, oledb, ...)&lt;br /&gt;
&lt;br /&gt;
Please sent me comments... If I get enough input I will include more aspects such as:&lt;br /&gt;
. Presentation patterns: MVC (console apps)&lt;br /&gt;
. Presentation patterns: MVP (win apps and web forms apps)&lt;br /&gt;
. Presentation patterns: Presentation Model (wpf and silverlight)&lt;br /&gt;
. Data Access Guidance&lt;br /&gt;
. Web Services Layer, DTO pattern&lt;br /&gt;
. Plug-in patterns&lt;br /&gt;
. Domain Driven Design / aggregates, validation, rules&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-5606435919145954183?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SwvZc1E2piqZqxwHkroSEstk8fY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SwvZc1E2piqZqxwHkroSEstk8fY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SwvZc1E2piqZqxwHkroSEstk8fY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SwvZc1E2piqZqxwHkroSEstk8fY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/sm0f3xRfCHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/5606435919145954183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/12/i-have-posted-very-nice-sample.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5606435919145954183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/5606435919145954183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/sm0f3xRfCHU/i-have-posted-very-nice-sample.html" title="ArchitectureSamples-FunqUnity in C#4.0" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/12/i-have-posted-very-nice-sample.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYAQXs_fCp7ImA9WxBRF00.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8657345744170201503</id><published>2009-11-22T12:08:00.003+01:00</published><updated>2010-01-05T16:42:20.544+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T16:42:20.544+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><title>List of most common Design Patterns</title><content type="html">&lt;a href="http://www.deaddevssociety.com/2009/11/list-of-most-common-design-patterns.html" style="display:none" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns=''&gt;&lt;p&gt;In &lt;a title='Software engineering' href='http://en.wikipedia.org/wiki/Software_engineering'&gt;software engineering&lt;/a&gt;, a design pattern is a general reusable solution to a commonly occurring problem in &lt;a title='Software design' href='http://en.wikipedia.org/wiki/Software_design'&gt;software design&lt;/a&gt;. A design pattern is not a finished design that can be transformed directly into &lt;a title='Code (computer programming)' href='http://en.wikipedia.org/wiki/Code_(computer_programming)'&gt;code&lt;/a&gt;. It is a description or template for how to solve a problem that can be used in many different situations. &lt;a title='Object-oriented' href='http://en.wikipedia.org/wiki/Object-oriented'&gt;Object-oriented&lt;/a&gt; design patterns typically show relationships and &lt;a title='Interaction' href='http://en.wikipedia.org/wiki/Interaction'&gt;interactions&lt;/a&gt; between &lt;a title='Class (computer science)' href='http://en.wikipedia.org/wiki/Class_(computer_science)'&gt;classes&lt;/a&gt; or &lt;a title='Object (computer science)' href='http://en.wikipedia.org/wiki/Object_(computer_science)'&gt;objects&lt;/a&gt;, without specifying the final application classes or objects that are involved. &lt;a href='http://en.wikipedia.org/wiki/Design_pattern_(computer_science)'&gt;Design pattern (computer science)&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Below I have a list of most common design patterns.&lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;Creational Patterns &lt;br /&gt;
&lt;/h3&gt;&lt;h4&gt;&lt;em&gt;Abstract Factory&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Creates an instance of several families of classes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Builder&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Separates object construction from its representation &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Factory Method&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Creates an instance of several derived classes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Prototype&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A fully initialized instance to be copied or cloned &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Singleton&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A class of which only a single instance can exist &lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;Structural Patterns &lt;br /&gt;
&lt;/h3&gt;&lt;h4&gt;&lt;em&gt;Adapter&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Match interfaces of different classes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Bridge&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Separates an object's interface from its implementation &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Composite&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A tree structure of simple and composite objects &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Decorator&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Add responsibilities to objects dynamically &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Façade&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A single class that represents an entire subsystem &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Flyweight&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A fine-grained instance used for efficient sharing &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Proxy&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;An object representing another object &lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;Behavioral Patterns &lt;br /&gt;
&lt;/h3&gt;&lt;h4&gt;&lt;em&gt;Chain of Responsibility&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A way of passing a request between chains of objects &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Command&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Encapsulate a command request as an object &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Interpreter&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A way to include language elements in a program &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Iterator&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Sequentially access the elements of a collection &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Mediator&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Defines simplified communication between classes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Memento&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Capture and restore an object's internal state &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Observer&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;A way of notifying change to a number of classes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;State&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Alter an object's behavior when its state changes &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Strategy&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Encapsulates an algorithm inside a class &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Template Method&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Defer the exact steps of an algorithm to a subclass &lt;br /&gt;
&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Visitor&lt;br /&gt;
&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Defines a new operation to a class without change&lt;br /&gt;
&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8657345744170201503?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sJNkxHtN5wPrv2X0PdXaiGY6aV8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sJNkxHtN5wPrv2X0PdXaiGY6aV8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sJNkxHtN5wPrv2X0PdXaiGY6aV8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sJNkxHtN5wPrv2X0PdXaiGY6aV8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/gswFRvyXbVA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8657345744170201503/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/list-of-most-common-design-patterns.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8657345744170201503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8657345744170201503?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/gswFRvyXbVA/list-of-most-common-design-patterns.html" title="List of most common Design Patterns" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/list-of-most-common-design-patterns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIHQnYzeCp7ImA9WxNbFEQ.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8223910378957462616</id><published>2009-11-17T22:09:00.003+01:00</published><updated>2009-11-17T22:15:33.880+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-17T22:15:33.880+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unity" /><category scheme="http://www.blogger.com/atom/ns#" term="Functional" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Type safe named instances with Unity</title><content type="html">The following example demonstrates registering a named instance in Unity. The only problem here is that both the registration and resolving of the dependency is done using a string. Even using a static class to hardcode all strings in a kind-of type safe way gives us no guaranty that the developer will respect the convention.&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
IUnityContainer container = new UnityContainer();
//register
container.RegisterInstance&lt;string&gt;(ConnectionType.Ora, "#connstring#ora#", 
    new ContainerControlledLifetimeManager());
container.RegisterInstance&lt;string&gt;(ConnectionType.Sql, "#connstring#sql#", 
    new ContainerControlledLifetimeManager());
container.RegisterInstance&lt;string&gt;(ConnectionType.MsAccess, "#connstring#access#", 
    new ContainerControlledLifetimeManager());
//resolve
container.Resolve&lt;dataservice&gt;();
Console.ReadLine();
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
public static class ConnectionType
{
  public const string Ora = "Ora";
  public const string Sql = "Sql";
  public const string MsAccess = "MsAccess";
}
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
public class DataService
{
	public DataService([Dependency(ConnectionType.Ora)]string connectionString)
	{
		Console.WriteLine( connectionString );
		//create connection here...
	}
}
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
An alternate way of doing this would be using a delegate to resolve the instance giving a type safe argument such as an enumeration. So the registration in unity is a bit different...&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
Func&lt;ConnectionType, string&gt; fConnString = delegate (ConnectionType connectionType)
{
    switch (connectionType)
    {
        //here you would really read the connection string
        //from a config file...
        case ConnectionType.Ora:
            return "#connstring#ora#";
        case ConnectionType.Sql:
            return "#connstring#sql#";
        case ConnectionType.MsAccess:
            return "#connstring#access#";
        default:
            return "#connstring#ora#";
    }
};

container.RegisterInstance&lt;Func&lt;ConnectionType, string&gt;&gt;(fConnString,
    new ContainerControlledLifetimeManager());

container.Resolve&lt;dataservice&gt;();

Console.ReadLine();
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Instead of a static class with constants we now have a type safe enumeration:&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
public enum ConnectionType
{
    Ora, Sql, MsAccess
}
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
...and finally the client class that resolves the delegate:&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
public class DataService
{
    public DataService(Func&lt;ConnectionType,string&gt; connectionString)
    {
        Console.WriteLine(connectionString(ConnectionType.Ora));
        //create connection here...
    }
}
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
In addition the actual resolving of the configuration string (typically read from a config) is done lazy... at the moment we really need it.&lt;br /&gt;
Finally we don't have ambiguity in registering in the container a type such as string, since we now mark the instance with an additional type (marker type).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8223910378957462616?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7HbS-_dIqvtY4gQAY3PySeWDwAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7HbS-_dIqvtY4gQAY3PySeWDwAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7HbS-_dIqvtY4gQAY3PySeWDwAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7HbS-_dIqvtY4gQAY3PySeWDwAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/PyH4-JNuUY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8223910378957462616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/type-safe-named-instances-with-unity.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8223910378957462616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8223910378957462616?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/PyH4-JNuUY4/type-safe-named-instances-with-unity.html" title="Type safe named instances with Unity" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/type-safe-named-instances-with-unity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQNSHsyfCp7ImA9Wx5RFko.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-1049901744747927403</id><published>2009-11-12T12:42:00.006+01:00</published><updated>2010-08-24T21:33:19.594+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-24T21:33:19.594+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Implementing a .NET Framework Data Provider</title><content type="html">Five years ago I needed to implement a web app for a chemicals company, that was using data from SqlServer, Oracle, Documentum and Hummingbird. The problem was that at that time both Documentum and Hummingbird (document management systems) had no oledb nor .net providers available. So my data layer became a big mess due to the fact that some of my code was through ADO.NET and the rest was using proprietary API's from Documentum and Hummingbird. In addition having such code was very error prone and not testable at all, since those API's at that time were very low level. &lt;br /&gt;
The solution that I had found was to implement my own .NET Data Provider. I used as basis an example posted on msdn: &lt;a href="http://msdn.microsoft.com/en-us/library/4ksaf9z5%28VS.71%29.aspx"&gt;Implementing a .NET Framework Data Provider&lt;/a&gt;.&lt;br /&gt;
The article provides a template implementation of a "Fake/Sample" data provider for an in-memory database "Fake/Sample". If you are investigating in this direction then following the above link will be very helpful.&lt;br /&gt;
For your convenience I have created a sample wpf app using this code. The code is an identical copy of the original; I have only made some improvements to make it up-to-date with .NET 4.0 since the initial article was written for .NET 1.0&lt;br /&gt;
You can checkout the sources using tortoise: &lt;a href="http://bakopanos.googlecode.com/svn/trunk/blog/DotNetDataProviderTemplate/"&gt;http://bakopanos.googlecode.com/svn/trunk/blog/DotNetDataProviderTemplate/&lt;/a&gt;&lt;br /&gt;
I used Visual Studio 2010 for this :-)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
An overview of the code&lt;/b&gt;&lt;br /&gt;
The "fake/sample" database in the sample mimics a real world database that returns a cursor of the following structure:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;internal class SampleDbResultSet
{
    public struct MetaData
    {
        public string name;
        public Type type;
        public int maxSize;
    }
    public int recordsAffected;
    public MetaData[] metaData;
    public object[,] data;
}
&lt;/pre&gt;The commands supported by the sample database are startwith "select " and startwith "update ". This is it: 2 hardcoded commands, no args or anything... &lt;br /&gt;
The select command returns always the following resultset hardcoded in code: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: plain; gutter: false;"&gt;id  name  orderid  
1  Biggs  2001  
2  Brown  2121  
3  Jones  2543  
4  Smith  2772  
5  Tyler  3521  
&lt;/pre&gt;&lt;br /&gt;
The update command simply alters the (2,2) cell of the above table.&lt;br /&gt;
&lt;br /&gt;
Once you understand this sample you can implement your own wrapper for the database of your choice. I am about to implement a dataprovider for reading a large number of xml files...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-1049901744747927403?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H3_YFpBhWBm7XtOA-4HMxEij9ic/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H3_YFpBhWBm7XtOA-4HMxEij9ic/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H3_YFpBhWBm7XtOA-4HMxEij9ic/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H3_YFpBhWBm7XtOA-4HMxEij9ic/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/f6-CthNzfZw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/1049901744747927403/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/implementing-net-framework-data.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1049901744747927403?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/1049901744747927403?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/f6-CthNzfZw/implementing-net-framework-data.html" title="Implementing a .NET Framework Data Provider" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/implementing-net-framework-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04CSH47fSp7ImA9WxNbEUQ.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-4972168030733086842</id><published>2009-11-12T10:27:00.001+01:00</published><updated>2009-11-14T12:59:29.005+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-14T12:59:29.005+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Preventing Dialogs or Trace.Fail</title><content type="html">The System.Diagnostics provide a very nice infrastructure for logging. When you start an app, by default a DefaultTraceListener is added to the Debug.Listeners collection. The problem is that the DefaultTraceListener instance has the property AssertUiEnabled set to true. This will popup a nice message box, in case for example of this statement&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
Debug.Assert(false);
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UqpPEshhhrk/SvvUWcJM3MI/AAAAAAAAADE/SKga47dRwzc/s1600-h/DebugAssert.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" sr="true" src="http://3.bp.blogspot.com/_UqpPEshhhrk/SvvUWcJM3MI/AAAAAAAAADE/SKga47dRwzc/s320/DebugAssert.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
In winforms or console apps this is quite nice. Especially the possibility to attempt a retry ...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UqpPEshhhrk/SvvUd42aN2I/AAAAAAAAADM/cdKdwVh8bO0/s1600-h/DebugAssertRetry.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" sr="true" src="http://3.bp.blogspot.com/_UqpPEshhhrk/SvvUd42aN2I/AAAAAAAAADM/cdKdwVh8bO0/s320/DebugAssertRetry.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
In case you need to disable this dialog: for a wpf app, for asp.net, for a wcf service... then you simply need to set the AssertUiEnabled property to false. In addition you can wire your own outputs...&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ Debug.AutoFlush = true; 
//fix issue with messagebox in wpf
var debugListeners = Debug.Listeners.OfType&lt;DefaultTraceListener&gt;().ToArray(); 
foreach (var listener in debugListeners) 
{
  //If you reflector into the implementation of the DefaultTraceListener in the .NET Framework 
  //you'll see a call to AssertWrapper.ShowAssert (that should only happen if AssertUIEnabled 
  //is true and UI Permissions are available.) 
  //http://www.hanselman.com/blog/CommentView.aspx?guid=e4dc1e1c-3aca-4d4a-8b09-255a3e7a1e14
  listener.AssertUiEnabled = false;
}
//also to console...
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out) { Name = "Console" });                         
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-4972168030733086842?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XQR6EbczDTYGDCrlVWxAgtUcNKU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XQR6EbczDTYGDCrlVWxAgtUcNKU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XQR6EbczDTYGDCrlVWxAgtUcNKU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XQR6EbczDTYGDCrlVWxAgtUcNKU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/UN59lqHYd30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/4972168030733086842/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/preventing-dialogs-or-tracefail.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4972168030733086842?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/4972168030733086842?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/UN59lqHYd30/preventing-dialogs-or-tracefail.html" title="Preventing Dialogs or Trace.Fail" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UqpPEshhhrk/SvvUWcJM3MI/AAAAAAAAADE/SKga47dRwzc/s72-c/DebugAssert.PNG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/preventing-dialogs-or-tracefail.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04CSH47fSp7ImA9WxNbEUQ.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-8251601538507419877</id><published>2009-11-11T22:26:00.006+01:00</published><updated>2009-11-14T12:59:29.005+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-14T12:59:29.005+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>How much does it cost to resolve with Unity?</title><content type="html">The following sample shows how expensive it is to resolve types using a DI container. On my notebook it showed the following:&lt;br /&gt;
&lt;br /&gt;
00:00:00.0040000&lt;br /&gt;
00:00:01.7080000&lt;br /&gt;
00:00:00.1640000&lt;br /&gt;
&lt;br /&gt;
As you can easily see resolving a type with Unity is something like at least 40 times slower. Is it worth it? I believe yes because you'll catch up with the performance on good design. &lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: c-sharp"&gt;&lt;![CDATA[ 
using System;
using System.Linq;
using Microsoft.Practices.Unity;

static class Program
{
  static IUnityContainer container = new UnityContainer();

  static void Main(string[] args)
  {
    //create instance without unity
    var lc1 = DateTime.Now;

    for (int i = 0; i &lt; 100; i++)
    {
      new Log();
    }

    var lc2 = DateTime.Now;

    Console.WriteLine(lc2 - lc1);

    //create instance with unity using delegates
    var la1 = DateTime.Now;

    for (int i = 0; i &lt; 100; i++)
    {
      container.RegisterInstance&lt;Func&lt;ILog&gt;&gt;(i.ToString(),
        () =&gt; container.Resolve&lt;Log&gt;());
    }

    for (int i = 0; i &lt; 100; i++)
    {
      Func&lt;ILog&gt; fLog = container.Resolve&lt;Func&lt;ILog&gt;&gt;(i.ToString());
      ILog log = fLog();
    }

    var la2 = DateTime.Now;

    Console.WriteLine(la2 - la1);

    //create instance with unity
    var lb1 = DateTime.Now;

    for (int i = 0; i &lt; 100; i++)
    {
      container.RegisterType&lt;ILog, Log&gt;(i.ToString());
    }

    for (int i = 0; i &lt; 100; i++)
    {
      ILog log = container.Resolve&lt;ILog&gt;(i.ToString());
    }

    var lb2 = DateTime.Now;

    Console.WriteLine(lb2 - lb1);

    Console.ReadLine();
  }
}

public interface ILog { }
public class Log : ILog { }
]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-8251601538507419877?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N8xbPjvCI77j-cBPhygNkb7ePro/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N8xbPjvCI77j-cBPhygNkb7ePro/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N8xbPjvCI77j-cBPhygNkb7ePro/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N8xbPjvCI77j-cBPhygNkb7ePro/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/xynIro9Rkm0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/8251601538507419877/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/how-much-does-it-cost-to-resolve-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8251601538507419877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/8251601538507419877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/xynIro9Rkm0/how-much-does-it-cost-to-resolve-with.html" title="How much does it cost to resolve with Unity?" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/how-much-does-it-cost-to-resolve-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGQncyfSp7ImA9WxNbEUw.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-2259611568969526615</id><published>2009-11-11T11:09:00.000+01:00</published><updated>2009-11-13T12:40:23.995+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T12:40:23.995+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>Hints: migration from VS2008SP1 -&gt; VS2010Ultimate</title><content type="html">1. The 2nd line of the project file has being changed &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Project&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;3.5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Project&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;4.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;When you try to open the migrated project with VS2008 you simply get the following warning:&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;Project file contains ToolsVersion=&amp;quot;4.0&amp;quot;, which is not supported by this version of MSBuild. Treating the project as if it had ToolsVersion=&amp;quot;3.5&amp;quot;.&lt;/pre&gt;&lt;br /&gt;...all the rest work fine! &lt;/div&gt;&lt;br /&gt;2. A whole set of new elements has being added to the default PropertyGroup of the project; all these are not breaking when you try to open the migrated project with VS2008.&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpgradeFlags&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpgradeFlags&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OldToolsVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;3.5&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OldToolsVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpgradeBackupLocation&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;PublishUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;http://localhost/Utilities/&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;PublishUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InstallFrom&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Web&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InstallFrom&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Foreground&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateInterval&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;7&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateInterval&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateIntervalUnits&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Days&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateIntervalUnits&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdatePeriodically&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdatePeriodically&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateRequired&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateRequired&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;MapFileExtensions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;MapFileExtensions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ApplicationRevision&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ApplicationRevision&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ApplicationVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;1.0.0.%2a&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ApplicationVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;IsWebBootstrapper&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;IsWebBootstrapper&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UseApplicationTrust&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UseApplicationTrust&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3. A new element has being added on the PropertyGroup of each configuration; also nothing breaking... VS2008SP1 ignores them. &lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeAnalysisRuleSet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;AllRules.ruleset&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeAnalysisRuleSet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;4. A new ItemGroup have being added; also nothing breaking... VS2008SP1 ignores them.&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Include&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.Net.Client.3.5&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;False&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;.NET Framework 3.5 SP1 Client Profile&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Include&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.Net.Framework.3.5.SP1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;False&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;.NET Framework 3.5 SP1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Include&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.VisualBasic.PowerPacks.10.0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;False&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Microsoft Visual Basic PowerPacks 10.0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Include&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Microsoft.Windows.Installer.3.1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;False&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Windows Installer 3.1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ProductName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Install&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BootstrapperPackage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;5. If your projects have being set to &amp;quot;Treat warnings as errors&amp;quot; then VS2010 is much more sensitive, especially to xmldocumentation mistakes.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-2259611568969526615?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/adjl9aq-SVH_gBuLNB3P8B_F5ao/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/adjl9aq-SVH_gBuLNB3P8B_F5ao/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/adjl9aq-SVH_gBuLNB3P8B_F5ao/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/adjl9aq-SVH_gBuLNB3P8B_F5ao/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/FADUUnBB-Hg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/2259611568969526615/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/hints-migration-from-vs2008sp1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/2259611568969526615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/2259611568969526615?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/FADUUnBB-Hg/hints-migration-from-vs2008sp1.html" title="Hints: migration from VS2008SP1 -&amp;gt; VS2010Ultimate" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/hints-migration-from-vs2008sp1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGQncyfSp7ImA9WxNbEUw.&quot;"><id>tag:blogger.com,1999:blog-725851120415703179.post-2263583016709450691</id><published>2009-11-11T10:26:00.000+01:00</published><updated>2009-11-13T12:40:23.995+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T12:40:23.995+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>Fail: VS2010 Setup</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UqpPEshhhrk/SvqDGQ9pRuI/AAAAAAAAAC8/fFSt306CaZ0/s1600-h/fail_vs2010_setup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_UqpPEshhhrk/SvqDGQ9pRuI/AAAAAAAAAC8/fFSt306CaZ0/s320/fail_vs2010_setup.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/725851120415703179-2263583016709450691?l=www.deaddevssociety.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tYLxOvO9u0Rr3g_6-Y3wScFg5yU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYLxOvO9u0Rr3g_6-Y3wScFg5yU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tYLxOvO9u0Rr3g_6-Y3wScFg5yU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYLxOvO9u0Rr3g_6-Y3wScFg5yU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BakopanosKonstantinos/~4/jHMcBcrghzE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.deaddevssociety.com/feeds/2263583016709450691/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.deaddevssociety.com/2009/11/fail-vs2010-setup.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/2263583016709450691?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/725851120415703179/posts/default/2263583016709450691?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BakopanosKonstantinos/~3/jHMcBcrghzE/fail-vs2010-setup.html" title="Fail: VS2010 Setup" /><author><name>Bakopanos Konstantinos</name><uri>http://www.blogger.com/profile/16981058303396266630</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_UqpPEshhhrk/SXo6Cpql5TI/AAAAAAAAABs/XTukl9ON_5I/S220/CostasB.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UqpPEshhhrk/SvqDGQ9pRuI/AAAAAAAAAC8/fFSt306CaZ0/s72-c/fail_vs2010_setup.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.deaddevssociety.com/2009/11/fail-vs2010-setup.html</feedburner:origLink></entry></feed>

