<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6516582153992491495</id><updated>2011-11-07T23:40:00.600-08:00</updated><category term='SQLSERVER'/><category term='Service Locator'/><category term='WCF'/><category term='Expression Tree'/><category term='Miracle'/><category term='StructureMap'/><category term='Principles'/><category term='IOC'/><category term='Fluent NHibernate'/><category term='Bootstrapper'/><category term='AutoMapper'/><category term='Regular Expression'/><category term='Web Service'/><category term='Unit Testing'/><category term='Lamdba Expression'/><category term='ASP.NET MVC 2'/><category term='ASP.NET MVC'/><category term='Entity Framework'/><category term='Pattern'/><title type='text'>Context is King</title><subtitle type='html'>thangchung is a newbie in coding</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-3560752170863952812</id><published>2010-06-16T11:43:00.000-07:00</published><updated>2010-06-16T11:43:26.559-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miracle'/><title type='text'>Moving my house to asp.net weblogs</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Comic Sans MS'; font-size: 12px;"&gt;Dear everyone,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Comic Sans MS'; font-size: 12px;"&gt;This morning I received the email from Microsoft that they just created for me the blog at&amp;nbsp;&lt;a href="http://weblogs.asp.net/" style="color: #0066cc;"&gt;http://weblogs.asp.net&lt;/a&gt;. I really happy about that and decided to moving my house from Blogger (&lt;a href="http://thangcq.blogspot.com/" style="color: #0066cc;"&gt;http://thangcq.blogspot.com&lt;/a&gt;) to asp.net blogs (&lt;a href="http://weblogs.asp.net/thangchung" style="color: #0066cc;"&gt;http://weblogs.asp.net/thangchung&lt;/a&gt;). If anyone want to read some articles at Blogger, you still read all of it at those. I will not move all articles to asp.net weblogs, and in the future I will try to write new articles at asp.net blog. I hope anyone will support me in that. And in next time, I will try to finish the&amp;nbsp;&lt;a href="http://nma.codeplex.com/" mce_href="http://nma.codeplex.com/" style="color: #0066cc;" target="_blank"&gt;NMA project&lt;/a&gt;&amp;nbsp;at codeplex.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Comic Sans MS'; font-size: 12px;"&gt;Sorry for this&amp;nbsp;inconvenience!&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-3560752170863952812?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/3560752170863952812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/06/moving-my-house-to-aspnet-weblogs.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/3560752170863952812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/3560752170863952812'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/06/moving-my-house-to-aspnet-weblogs.html' title='Moving my house to asp.net weblogs'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-6598150910877509669</id><published>2010-06-10T23:40:00.000-07:00</published><updated>2010-06-10T23:54:19.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miracle'/><title type='text'>Cast anonymous types</title><content type='html'>Today, when coding for one module in my project at company, I had a problem that make me crazy. Used &lt;a href="http://msdn.microsoft.com/en-us/library/bb383973.aspx"&gt;var&lt;/a&gt; keyword on .NET 3.5, it's a anonymous type, so when we go out its scope, we don't know its type. I think many people also had this problem like me. So after using many methods for solve this problem, I also found the best solution for it. Thanks &lt;a href="http://blogs.msdn.com/b/alexj"&gt;Alex&lt;/a&gt; for best idea from him! Now there are some my effort for solve it:&lt;br /&gt;+ First thing, I tried to coding and gave this error:&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;em&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cannot cast 'exampleObj' (which has an actual type of '&amp;lt;&amp;gt;f__AnonymousType0&amp;lt;string,string&amp;gt;&lt;string,string&gt;')&lt;/strong&gt;&lt;/em&gt; ...&lt;/span&gt;&lt;br /&gt;+ Next, I started my working&amp;nbsp;for solving&amp;nbsp;it.&amp;nbsp;Wrote the extension method for cast anonymous method:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public static class Extender&lt;br /&gt;{&lt;br /&gt; public static T Cast&lt;t&gt;(this object obj, T what)&lt;br /&gt;        {&lt;br /&gt;            return (T)obj;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;+ Object that content the anonymous type:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;var exampleObj = from node in rootNode.Descendants()&lt;br /&gt;                 where node.FirstAttribute != null &amp;amp;&amp;amp; node.FirstAttribute.Value == "ExampleName"&lt;br /&gt;                 select new&lt;br /&gt;                 {&lt;br /&gt;                  FirstField = node.FirstAttribute.Value,&lt;br /&gt;                        SecondField = node.LastAttribute.Value&lt;br /&gt;                 };&lt;br /&gt;&lt;/pre&gt;Binding this object to &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.aspx"&gt;ListView&lt;/a&gt;:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;exampleObj .All(x =&amp;gt;&lt;br /&gt; {&lt;br /&gt; lstView.Items.Add(x);&lt;br /&gt;        lstView.ValueMember = "FirstField ";&lt;br /&gt;        lstView.DisplayMember = "SecondField ";&lt;br /&gt;        return true;&lt;br /&gt; });&lt;br /&gt;&lt;/pre&gt;+ And used the extension method for cast anonymous type:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;var exampleObj= lstView.SelectedItem;&lt;br /&gt;var castObj = exampleObj.Cast(new { &lt;br /&gt;               FirstField = "", SecondField = ""&lt;br /&gt;           });&lt;br /&gt;&lt;/pre&gt;Now we can use it very normally:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;var firstField = castObj.FirstField;&lt;br /&gt;var secondField = castObj.SecondField;&lt;br /&gt;&lt;/pre&gt;+ References: &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/alexj/archive/2007/11/22/t-castbyexample-t-object-o-t-example.aspx?wa=wsignin1.0"&gt;http://blogs.msdn.com/b/alexj/archive/2007/11/22/t-castbyexample-t-object-o-t-example.aspx?wa=wsignin1.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb383973.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb383973.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-6598150910877509669?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/6598150910877509669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/06/cast-anonymous-types.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6598150910877509669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6598150910877509669'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/06/cast-anonymous-types.html' title='Cast anonymous types'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-7540093482179646808</id><published>2010-05-25T04:48:00.000-07:00</published><updated>2010-05-25T05:35:32.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StructureMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Service Locator'/><category scheme='http://www.blogger.com/atom/ns#' term='Bootstrapper'/><title type='text'>Implementing Service Locator pattern</title><content type='html'>Today, I will write about &lt;a href="http://en.wikipedia.org/wiki/Service_locator_pattern"&gt;Service Locator&lt;/a&gt; pattern. Reason, because I must make sure that all thing shall run well up to now on &lt;a href="http://nma.codeplex.com/"&gt;NMA project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The first thing, we should mention about the theory. So what is the Service Locator? In Java community, they defined it is&lt;br /&gt;&lt;b&gt;&lt;i&gt;"The Service Locator abstracts the API lookup (naming) services, vendor dependencies, lookup complexities, and business object creation, and provides a simple interface to clients. This reduces the client's complexity. In addition, the same client or other clients can reuse the Service Locator"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;But this definition also don't make you clear about Service Locator. I only give you one example as: Do you know your manager in company? Yeah, you must know him/her. But now, I suggest you a orther question, do you know about all employees in your company? Maybe you know all. But with me, I don't need to know that. When I want to find some information about the employee that work in my company, I only contact with my Human Resource Manager (HRM). So he will give me full of information about this employee. Now come back to our situation about Service Locator, you can imagine your HRM is a Service Locator. You don't need know full of information about all employees in company. He will keep all information for you, and that is his work in company.&lt;br /&gt;&lt;br /&gt;Now if you want to know more clearly about Service Locator, you can reference to the article that had written by &lt;a href="http://martinfowler.com/"&gt;Martin Powler&lt;/a&gt;. I will give you all links at a bottom of this post.&lt;br /&gt;&lt;br /&gt;So why do we use Service Locator? Because Service Locator make you free in your work, you don't need care about detail implementation of dependency classes. You shall assign this task for Service Locator, so you have much time to concentrate other task in your project. Service Locator will help you managed life cycle of all instances in your project (maybe its task do by Structure Map). All class only know about the contract (here is interface and abstract class), so it make your components don't couples each other. Your components shall be easy to re-use, maintain,...&lt;br /&gt;&lt;br /&gt;Nearly 3 months ago, I read some articles said that Service Locator is a anti-pattern, hard to Unit Testing the dependency class, but I also find method to avoid it. I think you need research about &lt;a href="http://blog.vuscode.com/malovicn/archive/2008/06/08/design-for-testability-transparent-and-opaque-dependencies-part-8.aspx"&gt;Opaque dependencies and Tranparent Dependencies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now is the time I will show you about my work in NMA project. In MNA, I used &lt;a href="http://commonservicelocator.codeplex.com/"&gt;Microsoft Service Locator &lt;/a&gt;that integrated with Structure Map for taking care all components in MNA. You should download the Structure Map adapter at &lt;a href="http://commonservicelocator.codeplex.com/wikipage?title=StructureMap%20Adapter&amp;amp;referringTitle=Home"&gt;here &lt;/a&gt;into your computer and try to build it. After you built successful, you are able to reference it in your solutions. In my solution, I combined Service Locator with &lt;a href="http://thangcq.blogspot.com/2010/05/implementing-bootstrapper-for-your.html"&gt;Bootstrapper &lt;/a&gt;for building unify system in NMA. This is my code:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public abstract class CommonBootStrapper&lt;br /&gt;    {&lt;br /&gt;        public static IServiceLocator Locator;&lt;br /&gt;&lt;br /&gt;        protected IConfigurationManager _configurationManager;&lt;br /&gt;        protected IList&lt;type&gt; _registries;&lt;br /&gt;&lt;br /&gt;        protected CommonBootStrapper(IList&lt;type&gt; registries, IConfigurationManager configurationManager, string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            _registries = registries;&lt;br /&gt;            _configurationManager = configurationManager;&lt;br /&gt;            Locator = CreateServiceLocator(conStringName, bootTaskAssemblies);&lt;br /&gt;            Run();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Create Service Locator object, including create and configure Nhibernate object&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;Service Locator instance&lt;/returns&gt;&lt;br /&gt;        protected abstract IServiceLocator CreateServiceLocator(string conStringName, params string[] bootTaskAssemblies);&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Run all task in background&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected abstract void Run();&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;If you used to read about my Bootstrapper article, you maybe saw this code. But anyway, it's not make you disturb! I continue implemeting the concreate class as:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public class BootStrapper : CommonBootStrapper&lt;br /&gt;    {&lt;br /&gt;        public BootStrapper() : this(null, null, "", "") { }&lt;br /&gt;&lt;br /&gt;        public BootStrapper(IList&lt;type&gt; registries, IConfigurationManager configurationManager, string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;            : base(registries, configurationManager, conStringName, bootTaskAssemblies)&lt;br /&gt;        { }     &lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Create ServiceLocator object&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        protected override IServiceLocator CreateServiceLocator(string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            RegisterRegistry(conStringName, bootTaskAssemblies);&lt;br /&gt;            return new StructureMap.ServiceLocatorAdapter.StructureMapServiceLocator(&lt;br /&gt;                ObjectFactory.Container);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Using Structure Map for scanning all instances from Assemply&lt;br /&gt;        /// , after that we call for execiting it&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected override void Run()&lt;br /&gt;        {&lt;br /&gt;            var listTask = IoC.GetAllInstances&lt;ibootstrappertask&gt;();&lt;br /&gt;&lt;br /&gt;            if (listTask != null)&lt;br /&gt;            {&lt;br /&gt;                foreach (var task in listTask)&lt;br /&gt;                {&lt;br /&gt;                    task.Execute();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Register NHibernate configuration is a first component&lt;br /&gt;        /// and other component we'll register after that&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        private void RegisterRegistry(string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            Check.Assert(_registries != null, "List of Registries is null");&lt;br /&gt;            Check.Assert(_registries.Count &amp;gt; 0, "List of Registries must be larger than zero");&lt;br /&gt;            Check.Assert(_configurationManager != null, "ConfigurationManager instance is null");&lt;br /&gt;            Check.Assert(string.IsNullOrEmpty(conStringName) != true, "Connnection string name is null or empty");&lt;br /&gt;            Check.Assert(bootTaskAssemblies != null, "list of assemblies is null");&lt;br /&gt;&lt;br /&gt;            ObjectFactory.Initialize(x =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                foreach (var registry in _registries)&lt;br /&gt;                {&lt;br /&gt;                    if (string.Compare(registry.Name, typeof(CoreRegistry).Name) == 0)&lt;br /&gt;                    {&lt;br /&gt;                        Registry coreRegistry = (Registry)Activator.CreateInstance(typeof(CoreRegistry), _configurationManager, conStringName, bootTaskAssemblies);&lt;br /&gt;                        x.AddRegistry(coreRegistry);&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        Registry otherRegistry = (Registry)Activator.CreateInstance(registry);&lt;br /&gt;                        x.AddRegistry(otherRegistry);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;In this trunk of code, you only need notice some lines code as below:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;protected override IServiceLocator CreateServiceLocator(string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            RegisterRegistry(conStringName, bootTaskAssemblies);&lt;br /&gt;            return new StructureMap.ServiceLocatorAdapter.StructureMapServiceLocator(&lt;br /&gt;                ObjectFactory.Container);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;I registered my Service Locator and used Structure Map adapter in this function. And that is all thing I want to shared with you. Now we only need new the Bootstrapper, so your Service Locator will register with it, and all components of own application shall be available to using.&lt;br /&gt;&lt;br /&gt;+ References:&lt;br /&gt;&lt;a href="http://martinfowler.com/articles/injection.html#UsingAServiceLocator"&gt;http://martinfowler.com/articles/injection.html#UsingAServiceLocator&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff649658.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff649658.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html"&gt;http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc337885.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc337885.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163739.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc163739.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-7540093482179646808?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/7540093482179646808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/05/implementing-service-locator-pattern.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7540093482179646808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7540093482179646808'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/05/implementing-service-locator-pattern.html' title='Implementing Service Locator pattern'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-7856285308212696236</id><published>2010-05-20T04:42:00.000-07:00</published><updated>2010-05-20T19:46:09.237-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoMapper'/><category scheme='http://www.blogger.com/atom/ns#' term='StructureMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Fluent NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Bootstrapper'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC 2'/><title type='text'>Implementing the Bootstrapper for your application</title><content type='html'>Do you know about Bootstrapper?&lt;br /&gt;If you don't know about it before, I will explain it now. If you used to turn on your computer, you shall see that&amp;nbsp;you only are able to work when your operating system (OS)&amp;nbsp;ready to booting. And underline your computer must do many works for preparing your OS. You can't see those, it only run underline. That is a bootstrapper task. You shall not be care about all task that run under OS, you only need working. Do you agree with me? Yeah! If you agree with me, you understood the jobs that Bootstrapper take it to you.&lt;br /&gt;Now is the time that we come back to software world, How&amp;nbsp;are we able to boot all our tasks in software (include Windows Form &amp;amp; Web)? And why must we run bootstrapper in our application? The second question, one articles&amp;nbsp;can answer for you at &lt;a href="http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx"&gt;here&lt;/a&gt;. And the first question I will answer for you after my post end. OK now we shall start to preparing all thing for implementing the Bootstrapper at below:&lt;br /&gt;&lt;br /&gt;+ First thing, we must define the interface for the contract in each task:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public interface IBootstrapperTask&lt;br /&gt;{&lt;br /&gt;     void Execute();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;+ Next, I will implement the abstract class for compositing all functions that I think I can re-use:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public abstract class CommonBootStrapper&lt;br /&gt;    {&lt;br /&gt;        public static IServiceLocator Locator;&lt;br /&gt;&lt;br /&gt;        protected IConfigurationManager _configurationManager;&lt;br /&gt;&lt;br /&gt;        protected CommonBootStrapper(IConfigurationManager configurationManager, string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            _configurationManager = configurationManager;&lt;br /&gt;            Locator = CreateServiceLocator(conStringName, bootTaskAssemblies);&lt;br /&gt;            Run();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Create Service Locator object, including create and configure Nhibernate object&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;Service Locator instance&lt;/returns&gt;&lt;br /&gt;        protected abstract IServiceLocator CreateServiceLocator(string conStringName, params string[] bootTaskAssemblies);&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Run all task in background&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected abstract void Run();&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;+ And I continue to implement sub-class for CommonBootStrapper that I just implemented:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public class BootStrapper : CommonBootStrapper&lt;br /&gt;    {&lt;br /&gt;        public BootStrapper() : this(null, "", "") { }&lt;br /&gt;&lt;br /&gt;        public BootStrapper(IConfigurationManager configurationManager, string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;            : base(configurationManager, conStringName, bootTaskAssemblies)&lt;br /&gt;        { }     &lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Create ServiceLocator object&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        protected override IServiceLocator CreateServiceLocator(string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            HibernateRegister(conStringName, bootTaskAssemblies);&lt;br /&gt;            return new StructureMap.ServiceLocatorAdapter.StructureMapServiceLocator(&lt;br /&gt;                ObjectFactory.Container);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Using Structure Map for scanning all instances from Assemply&lt;br /&gt;        /// , after that we call for execiting it&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected override void Run()&lt;br /&gt;        {&lt;br /&gt;            var listTask = IoC.GetAllInstances&lt;ibootstrappertask&gt;();&lt;br /&gt;&lt;br /&gt;            if (listTask != null)&lt;br /&gt;            {&lt;br /&gt;                foreach (var task in listTask)&lt;br /&gt;                {&lt;br /&gt;                    task.Execute();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Register NHibernate configuration for container&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        private void HibernateRegister(string conStringName, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            ObjectFactory.Initialize(x =&amp;gt; {&lt;br /&gt;                x.AddRegistry(new NHibernateRegistry(_configurationManager, conStringName, bootTaskAssemblies));                &lt;br /&gt;            });           &lt;br /&gt;        }&lt;br /&gt;    } &lt;br /&gt;&lt;/pre&gt;+ Don't confuse about some messy thing in my code. Because I copied it in &lt;a href="http://nma.codeplex.com/"&gt;NMA project&lt;/a&gt;, so it have many things (StructureMap, Automapper, Fluent NHibernate,...) in it. But if you follow all post at my blog, I will explain all thing for you. Now continue, we shall implement one class for registering Automapper task when my application started: &lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public class AutoMapperConfigurator : IBootstrapperTask&lt;br /&gt;    {&lt;br /&gt;        public void Execute()&lt;br /&gt;        {&lt;br /&gt;            Initialize();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void Initialize()&lt;br /&gt;        {&lt;br /&gt;            Mapper.Initialize(x =&amp;gt; x.AddProfile&lt;defaultprofile&gt;());            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;Please go to &lt;a href="http://thangcq.blogspot.com/2010/04/configurating-automapper.html"&gt;http://thangcq.blogspot.com/2010/04/configurating-automapper.html&lt;/a&gt; for clear about AutoMapper.&lt;br /&gt;Certainly, you can inplement many tasks for booting, such as setup action filter, add model binder, add custom view engine,...&lt;br /&gt;+ Finally, we shall call it in Global.asax for web or App.xaml in WPF. But in this post I only implement in web:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;protected void Application_Start()&lt;br /&gt;        {&lt;br /&gt;            AreaRegistration.RegisterAllAreas();&lt;br /&gt;&lt;br /&gt;            RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&lt;br /&gt;            new NMA.Infrastructure.NHibernate.Bootstrapper.BootStrapper(&lt;br /&gt;                new ConfigurationManagerWrapper(),&lt;br /&gt;                "NMAConnectionString",&lt;br /&gt;                "NMA.Infrastructure.NHibernate", "NMA.Application", "NMA.Infrastructure.AutoMapper");&lt;br /&gt;&lt;br /&gt;            ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;At here, I used StructureMap for scanning 3 dlls: NMA.Infrastructure.NHibernate, NMA.Application, NMA.Infrastructure.AutoMapper for finding all tasks in my application. &lt;br /&gt;I implemented scanning dll at CoreRegistry.cs, and this is the important function inside this class:&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;private void ScanTaskAssemblies(IAssemblyScanner scanner, params string[] bootTaskAssemblies)&lt;br /&gt;        {&lt;br /&gt;            for (int i = 0; i &lt; bootTaskAssemblies.Length; i++)&lt;br /&gt;            {&lt;br /&gt;                scanner.Assembly(bootTaskAssemblies[i].ToString());&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            scanner.AddAllTypesOf&lt;IBootstrapperTask&gt;();&lt;br /&gt;            scanner.WithDefaultConventions();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;As you see this function will find all class that implemented interface IBootstrapperTask. If you implement it in any other dll, you also show it for Bootstrapper.&lt;br /&gt;&lt;br /&gt;* And I answered for you the first question if you read all my post.&lt;br /&gt;In past time, I also suggested this ideas for &lt;a href="http://derans.blogspot.com"&gt;Deran Schilling &lt;/a&gt;and he also implemented very excellent post at &lt;a href="http://derans.blogspot.com/2010/01/aspnet-mvc-bootstrapper.html"&gt;here&lt;/a&gt;.&lt;br /&gt;OK, I just finished the post about Bootstrapper, if you don't want to implement from scratch, you can use Unity Bootstrapper that mention at &lt;a href="http://msdn.microsoft.com/en-us/library/ff648355.aspx"&gt;here&lt;/a&gt;. But it use &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc785479.aspx"&gt;Prism &lt;/a&gt;on WPF. &lt;br /&gt;Finally you can find all my source code on &lt;a href="http://nma.codeplex.com/"&gt;NMA project&lt;/a&gt;. Good bye and see you next time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-7856285308212696236?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/7856285308212696236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/05/implementing-bootstrapper-for-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7856285308212696236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7856285308212696236'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/05/implementing-bootstrapper-for-your.html' title='Implementing the Bootstrapper for your application'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-8842722277860081530</id><published>2010-05-12T01:20:00.000-07:00</published><updated>2010-05-12T01:24:25.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='AutoMapper'/><category scheme='http://www.blogger.com/atom/ns#' term='Expression Tree'/><category scheme='http://www.blogger.com/atom/ns#' term='Lamdba Expression'/><category scheme='http://www.blogger.com/atom/ns#' term='StructureMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Principles'/><category scheme='http://www.blogger.com/atom/ns#' term='IOC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bootstrapper'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC 2'/><title type='text'>Publishing a open source project on CodePlex</title><content type='html'>In 2 days later, I published NMA project on &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;. Now you can access to my project with URL &lt;a href="http://nma.codeplex.com"&gt;http://nma.codeplex.com&lt;/a&gt;. Now I'm trying to finishing this project. I finished the all layers except for UI layer. And now I 'm designing the GUI for it.&lt;br /&gt;In next post, I intend to writing the series posts about NMA project. Some posts that I wrote in past as:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://thangcq.blogspot.com/2010/04/mocking-lamda-expression-method.html"&gt;http://thangcq.blogspot.com/2010/04/mocking-lamda-expression-method.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thangcq.blogspot.com/2010/04/converting-expression-tree.html"&gt;http://thangcq.blogspot.com/2010/04/converting-expression-tree.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thangcq.blogspot.com/2010/04/configurating-automapper.html"&gt;http://thangcq.blogspot.com/2010/04/configurating-automapper.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thangcq.blogspot.com/2010/04/customizing-controller-factory-used-ioc.html"&gt;http://thangcq.blogspot.com/2010/04/customizing-controller-factory-used-ioc.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thangcq.blogspot.com/2010/05/unit-testing-uses-nunit-in-visual.html"&gt;http://thangcq.blogspot.com/2010/05/unit-testing-uses-nunit-in-visual.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope I will write many posts in future!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-8842722277860081530?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/8842722277860081530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/05/publish-open-source-project-on-codeplex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8842722277860081530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8842722277860081530'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/05/publish-open-source-project-on-codeplex.html' title='Publishing a open source project on CodePlex'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-2641512474966148863</id><published>2010-05-06T23:58:00.000-07:00</published><updated>2010-05-07T00:03:41.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miracle'/><title type='text'>Unit testing uses NUnit in Visual Studio 2010</title><content type='html'>Have you ever used NUnit in Visual Studio 2010?&lt;br /&gt;If you used it once times, I thought you shall be realized the problem at here. NUnit can't run on .NET 4.0. So how can I run it when I writes Unit Testing? There is have a little trick for running it well. You only added some line of XML in configuration file of NUnit. And this is my work:&lt;br /&gt;&lt;pre class="c#" name="code"&gt;&lt;startup&gt;&lt;br /&gt;   &lt;requiredruntime version="v4.0.30319" /&gt;&lt;br /&gt;&lt;/startup&gt;&lt;/pre&gt;Finding the &lt;runtime&gt; tag and adding the configuration tag is &lt;loadfromremotesources&gt;. And the result is&lt;br /&gt;&lt;pre class="c#" name="code"&gt;&lt;runtime&gt;&lt;br /&gt;   &lt;loadfromremotesources enabled="true" /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;/runtime&gt;&lt;/pre&gt;Hope it is useful trick for you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-2641512474966148863?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/2641512474966148863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/05/unit-testing-uses-nunit-in-visual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2641512474966148863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2641512474966148863'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/05/unit-testing-uses-nunit-in-visual.html' title='Unit testing uses NUnit in Visual Studio 2010'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-4924395783705919884</id><published>2010-04-28T20:01:00.000-07:00</published><updated>2010-05-19T23:52:41.058-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StructureMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Bootstrapper'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC 2'/><title type='text'>Customizing controller factory used Structure Map</title><content type='html'>I recently started to working on new version of &lt;a href="http://aspnet.codeplex.com/releases/view/41742"&gt;ASP.NET MVC 2&lt;/a&gt;. And the first thing I must to do is customizing the controller factory to using IoC for getting controller type. In the first stable version of ASP.NET MVC (1.0), I had done it, but in this version it had some thing changed. In special, when you inherited from the &lt;span style="color: orange;"&gt;DefaultControllerFactory &lt;span style="color: black;"&gt;class it didn't&lt;/span&gt;&lt;/span&gt; have the &lt;span style="color: orange;"&gt;RequestContext &lt;/span&gt;instance to the constructor. In the version 2, the constructor is have 2 parameters.&lt;br /&gt;&lt;br /&gt;But why do you need customizing the Controller Factory? That because you need injecting some instances to the constructor of Controller. For example, you coded the CategoryFacade class and wanted to injecting into the CategoryController for getting some data from Database. this is a situation that you need customizing the Controller Factory.&lt;br /&gt;&lt;br /&gt;Now, we started to implementing it. The first thing you need is inheriting the &lt;span style="color: orange;"&gt;DefaultControllerFactory&lt;span style="color: black;"&gt; class:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="c#" name="code" style="display: none;"&gt;public class StructureMapControllerFactory : DefaultControllerFactory&lt;br /&gt;    {&lt;br /&gt;        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)&lt;br /&gt;        {&lt;br /&gt;            //Debug.Print("Controller: {0}, Action: {1}", requestContext.RouteData.Values["Controller"], requestContext.RouteData.Values["Action"]);&lt;br /&gt;&lt;br /&gt;            if (controllerType == null)&lt;br /&gt;            {&lt;br /&gt;                //Debug.Print("Is IController: {0}", (controllerType is IController));&lt;br /&gt;                //Debug.Print("Is null: {0}", (controllerType == null));&lt;br /&gt;                return null;&lt;br /&gt;            } &lt;br /&gt;&lt;br /&gt;            return (IController)IoC.GetInstance(controllerType);            &lt;br /&gt;        }        &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;In my case, I used &lt;a href="http://www.google.com.vn/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fstructuremap.sourceforge.net%2F&amp;amp;ei=7fXYS9iGGsWyrAfhj4mwBQ&amp;amp;usg=AFQjCNF5IJRaxzf29qtQYnpJsMgFbUZH5w&amp;amp;sig2=56ShnNcb8VXI5jiJfWWmTg"&gt;Structure Map&lt;/a&gt;&amp;nbsp; for IoC container. And in my Registry class, I need scanning the Web assembly as below:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j2-uTVJFI/AAAAAAAAAGM/XLOTOqTtuSU/s1600/CustomizingControllerFactory_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j2-uTVJFI/AAAAAAAAAGM/XLOTOqTtuSU/s400/CustomizingControllerFactory_2.png" width="400" /&gt;&lt;/a&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now, we must notify for ASP.NET engine for it can understand my custom Controller. How do I make it?. It's really easy, I implemented as below: &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j32dxaTBI/AAAAAAAAAGU/VZAX5QuHPxQ/s1600/CustomizingControllerFactory_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j32dxaTBI/AAAAAAAAAGU/VZAX5QuHPxQ/s1600/CustomizingControllerFactory_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j32dxaTBI/AAAAAAAAAGU/VZAX5QuHPxQ/s640/CustomizingControllerFactory_3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Don't confuse about it. At here, I only implement the &lt;a href="http://www.google.com.vn/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAkQFjAA&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FBootstrapping_%28computing%29&amp;amp;ei=vvjYS5mCL8yzrAefrqWmDw&amp;amp;usg=AFQjCNFk6xJ-DAXmLl0xhGonUDSzlOzk1A&amp;amp;sig2=Ix3XFrnb70QIm1Bq3z262A"&gt;Bootstrapper &lt;/a&gt;for my application. So don't care about it. We only concentrate on the &lt;span style="color: orange;"&gt;ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory())&lt;/span&gt;. As you see I replaced the default Controller Factory with my custom Controller Factory. &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Next step, we need registering all my configuration, so when the website started we shall have all instances to using. In this post, I implemented the Bootstrapper for booting the Website. So we only write the simple line of code as below in Global.asax:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_oM6crbW6VWA/S9j6np0QRDI/AAAAAAAAAGc/yxXgquuFD4E/s1600/CustomizingControllerFactory_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://1.bp.blogspot.com/_oM6crbW6VWA/S9j6np0QRDI/AAAAAAAAAGc/yxXgquuFD4E/s640/CustomizingControllerFactory_4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;As you see, we registered all Areas and continued to booting my website by the Bootstrapper. Just simple thing! Now saving all codes, and press F5 in Visual Studio's IDE. We shall possible injecting the Category Facade instance as here:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j7nRnumSI/AAAAAAAAAGk/WGm3vuE1yys/s1600/CustomizingControllerFactory_5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="330" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9j7nRnumSI/AAAAAAAAAGk/WGm3vuE1yys/s400/CustomizingControllerFactory_5.png" width="400" /&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;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;Finally, in order to writing this post, I referenced many articles from Internet. And this is my resources:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://joelabrahamsson.com/entry/really-simple-ioc-with-aspnet-mvc-and-structuremap"&gt;http://joelabrahamsson.com/entry/really-simple-ioc-with-aspnet-mvc-and-structuremap&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://weblogs.asp.net/shijuvarghese/archive/2008/10/10/asp-net-mvc-tip-dependency-injection-with-structuremap.aspx"&gt;http://weblogs.asp.net/shijuvarghese/archive/2008/10/10/asp-net-mvc-tip-dependency-injection-with-structuremap.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://elijahmanor.com/webdevdotnet/post/using-structuremap-with-aspnet-mvc-mvc-contrib.aspx"&gt;http://elijahmanor.com/webdevdotnet/post/using-structuremap-with-aspnet-mvc-mvc-contrib.aspx&lt;/a&gt;&lt;br /&gt;Hope this post making you enjoy! Thanks and see you next time!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="color: orange;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-4924395783705919884?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/4924395783705919884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/04/customizing-controller-factory-used-ioc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/4924395783705919884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/4924395783705919884'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/04/customizing-controller-factory-used-ioc.html' title='Customizing controller factory used Structure Map'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oM6crbW6VWA/S9j2-uTVJFI/AAAAAAAAAGM/XLOTOqTtuSU/s72-c/CustomizingControllerFactory_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-7031530187074467105</id><published>2010-04-27T02:58:00.000-07:00</published><updated>2010-04-27T03:15:10.776-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoMapper'/><category scheme='http://www.blogger.com/atom/ns#' term='StructureMap'/><title type='text'>Configurating the AutoMapper</title><content type='html'>Have you ever configured the AutoMapper for your Application?&lt;br /&gt;&lt;br /&gt;I really impressed with &lt;a href="http://www.google.com.vn/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fautomapper.codeplex.com%2F&amp;amp;rct=j&amp;amp;q=automapper&amp;amp;ei=GbLWS_S3MMzCrAfFluiPBw&amp;amp;usg=AFQjCNGyIWUT6oA61LmaeE1Dy5_P6ZnGpw&amp;amp;sig2=Uh34ajVzkCTw_387wt9kyQ"&gt;AutoMapper&lt;/a&gt;'s &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/"&gt;Jimmy Bogard&lt;/a&gt;. If you aren't try it before, I advice you should try it now. It's so good for mapping objects (maybe entity to &lt;a href="http://www.google.com.vn/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FData_transfer_object&amp;amp;rct=j&amp;amp;q=DTO&amp;amp;ei=obLWS_SIO4y-rAfE5OyKBw&amp;amp;usg=AFQjCNHGCd8EWhSnAElrClQETBeMlhvQYA&amp;amp;sig2=jnCLB1wQmbmMpsTymXZr-w"&gt;DTO&lt;/a&gt;). I still remembered I take many time for writing mapping objects in past. But now with AutoMapper all thing is simple. Now I'm trying to collecting all best practices that I learned from co-worker and Internet, trying to implementing the project (it's not publish yet). And when implemented the AutoMapper for my Application, I also get some problems from it. So finally, I also finished my work. Now I will show it for you.&lt;br /&gt;&lt;br /&gt;In this post, I used &lt;a href="http://en.wikipedia.org/wiki/Bootstrapping_(computing)"&gt;Bootstrapper&lt;/a&gt; for booting my Application. I attend to writing a post about it later (comming soon :D). So I&amp;nbsp;need when my Application&amp;nbsp;run, I will have any thing I need. So I will implement&amp;nbsp;&lt;span style="color: orange;"&gt;IBootstrapperTask&lt;/span&gt;&amp;nbsp;for it. Next, I used the &lt;a href="http://www.google.com.vn/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAsQFjAA&amp;amp;url=http%3A%2F%2Fstructuremap.sourceforge.net%2F&amp;amp;rct=j&amp;amp;q=StructureMap&amp;amp;ei=F7XWS4alO9K-rAeuod29Bw&amp;amp;usg=AFQjCNF5IJRaxzf29qtQYnpJsMgFbUZH5w&amp;amp;sig2=eFl_5degw5C2et6mngLmhw"&gt;StructureMap&lt;/a&gt; for scanning all assemblies implement &lt;br /&gt;&lt;span style="color: orange;"&gt;IBootstrapperTask&lt;/span&gt; interface. &lt;br /&gt;&lt;br /&gt;And there are some code as below:&lt;br /&gt;&lt;br /&gt;+ Registry class (implement Registry class from Structure Map)&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/_oM6crbW6VWA/S9a1quXGeXI/AAAAAAAAAFk/yCkVUYLgSGU/s1600/ConfiguringAutomapper_1.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://1.bp.blogspot.com/_oM6crbW6VWA/S9a1quXGeXI/AAAAAAAAAFk/yCkVUYLgSGU/s400/ConfiguringAutomapper_1.png" tt="true" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;+ Profile class&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9a2BIqDxbI/AAAAAAAAAFs/iapMVcZtYAA/s1600/ConfiguringAutomapper_2.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="419" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9a2BIqDxbI/AAAAAAAAAFs/iapMVcZtYAA/s640/ConfiguringAutomapper_2.png" tt="true" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;+ AutoMapperConfigurator class&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_oM6crbW6VWA/S9a2Q5YbMsI/AAAAAAAAAF0/Tu0GXCv3z00/s1600/ConfiguringAutomapper_3.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://3.bp.blogspot.com/_oM6crbW6VWA/S9a2Q5YbMsI/AAAAAAAAAF0/Tu0GXCv3z00/s400/ConfiguringAutomapper_3.png" tt="true" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;As you see, it's seen very easy (^_^). I'm many thanks to some articles that I read in Internet. In specially, I really referenced to 2 articles as below:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx"&gt;http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://derans.blogspot.com/2009/12/automapper-aspnet-mvc.html"&gt;http://derans.blogspot.com/2009/12/automapper-aspnet-mvc.html&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Good bye and see you next post!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-7031530187074467105?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/7031530187074467105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/04/configurating-automapper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7031530187074467105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/7031530187074467105'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/04/configurating-automapper.html' title='Configurating the AutoMapper'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oM6crbW6VWA/S9a1quXGeXI/AAAAAAAAAFk/yCkVUYLgSGU/s72-c/ConfiguringAutomapper_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-591101272663714605</id><published>2010-04-23T21:05:00.000-07:00</published><updated>2010-04-23T23:08:08.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Expression Tree'/><category scheme='http://www.blogger.com/atom/ns#' term='Lamdba Expression'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><title type='text'>Converting Expression Tree</title><content type='html'>In this articles, I'm going to divide my post into 3 sections:&amp;nbsp;Problem, Design, Solution.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In Problem, I will describe about the problem that I got in my implementaion&lt;/li&gt;&lt;li&gt;In Design, I will show all method that I used in my implementation&lt;/li&gt;&lt;li&gt;Finally, I will show you my solution that I used for finishing my this article.&lt;/li&gt;&lt;/ul&gt;Now, I start with &lt;b&gt;Problem &lt;/b&gt;section. In my solution, I built some entity and in the Facade layer I wanted to export my entity to UI layer, but in Design Principle, we shouldn't expose my entity to UI layer. We can figure out it same with the shell, with my Facade layer is a shell of application. And now, my problem appeared, if I try to expose the service with Expression Tree (maybe Expression&amp;lt;...&amp;lt;Entity&amp;gt;&amp;gt;) is a parametter. At here, I just want to expose the service with Expression&amp;lt;...&amp;lt;DTO&amp;gt;&amp;gt;. So, how do I do that? Maybe I must to convert the Expression Tree from my entity to my DTO (&lt;a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html"&gt;Data Transfer Object&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;That is my problem, and now I will show you about my &lt;b&gt;Design &lt;/b&gt;for solving it. The first thing, I can do for now is introduction about &lt;a href="http://msdn.microsoft.com/en-us/library/bb397951.aspx"&gt;Expression Tree&lt;/a&gt; (ET) in .NET. Do you know about ET?&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"In general, expression trees are special kind of binary trees. Binary tree is a tree in which all nodes contain zero, one or two children. Why expression trees have been implemented as binary trees? Mainly because binary trees allows you to quickly find what you are looking for. The upper limit of steps necessary to find required information in binary tree equals to log2N, where N denotes the number of all nodes in a tree."&lt;/i&gt;&lt;/blockquote&gt;Do you know the difference between Lambda Expression (LE) with the Expression Tree? All of people didn't know about it, so I will show you now.&lt;br /&gt;&lt;br /&gt;LE is a wrapper of delegate function in .NET 2.0. And in the .NET 3.0 above, we wrap it with Func, Action, Predicate key word. So you can call the delegate function so easy and readable. Now we change to ET, as you saw in the definition above, did it make sense for you? ET is only a Data Structure contains the LE. You can figure out that you must transfer your object through the wire, and this is the place that ET participate in. Because ET is a Data Struture so when you transfered it to the UI layer, you must compile it into the LE and call LE to executing it. I hope you clear about this procedure. And the last thing I want to show you: &lt;i&gt;&lt;b&gt;"only using the ET when you want to transfer your object through the wire, maybe SOA architecture"&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;That definition about ET &amp;amp; LE is so far, I will turn back now. So what &lt;b&gt;Solution &lt;/b&gt;will I use to make it working in my code? In my &lt;a href="http://domaindrivendesign.org/"&gt;Application&lt;/a&gt; layer, I used &lt;a href="http://automapper.codeplex.com/"&gt;AutoMapper &lt;/a&gt;for mapping my entity with my DTO, and all thing it worked normally. Only one thing, the ET wasn't converted.And this was a place that I must to working.&lt;br /&gt;&lt;br /&gt;Go go, I start to introducing my code for you. My entities design is&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S9J2buwTQ9I/AAAAAAAAAEM/hFaJkucmMFQ/s1600/ConvertET_1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="427" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9J2buwTQ9I/AAAAAAAAAEM/hFaJkucmMFQ/s640/ConvertET_1.png" width="640" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And my entity code is&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/_oM6crbW6VWA/S9J3IAqrlfI/AAAAAAAAAEU/nrBm70EdCIQ/s1600/ConvertET_5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9J3IAqrlfI/AAAAAAAAAEU/nrBm70EdCIQ/s640/ConvertET_5.png" width="578" /&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;&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;The DTO's code is&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/_oM6crbW6VWA/S9J3Rm7Nc9I/AAAAAAAAAEc/0LuN_NEYC1Q/s1600/ConvertET_6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9J3Rm7Nc9I/AAAAAAAAAEc/0LuN_NEYC1Q/s400/ConvertET_6.png" width="400" /&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;Now I must to writing some code for my &lt;a href="http://domaindrivendesign.org/"&gt;Repository &lt;/a&gt;class.&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/_oM6crbW6VWA/S9J39nX91sI/AAAAAAAAAEk/NcLPyPJ6CJQ/s1600/ConvertET_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9J39nX91sI/AAAAAAAAAEk/NcLPyPJ6CJQ/s640/ConvertET_2.png" width="640" /&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;And in the implementation for Repository is&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/_oM6crbW6VWA/S9J4T7BqkMI/AAAAAAAAAEs/JDZnrcRksME/s1600/ConvertET_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="376" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9J4T7BqkMI/AAAAAAAAAEs/JDZnrcRksME/s640/ConvertET_3.png" width="640" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally, I implemented the Application layer is&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/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="347" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s640/ConvertET_4.png" width="640" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KBcFTDw6I/AAAAAAAAAE0/s3uYfGukGfA/s1600/ConvertET_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&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;&lt;br /&gt;&lt;br /&gt;Do you see the line:&amp;nbsp;&lt;b&gt;&lt;i&gt;var lambda = LambdaExpressionHelper&lt;/i&gt;&lt;/b&gt;&lt;icategory, categorydto=""&gt;&lt;b&gt;&lt;i&gt;.Convert(condition, identifyColumn);&lt;/i&gt;&lt;/b&gt;&lt;/icategory,&gt;&lt;br /&gt;That is my work, we are to divide the helper into 3 classification:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;x =&amp;gt; x.Name == "name"&lt;/li&gt;&lt;li&gt;x =&amp;gt; x.Id == Guid.NewGuid()&lt;/li&gt;&lt;li&gt;x =&amp;gt; x.CreatedDate.CompareTo(DateTime.Now) == 0&lt;/li&gt;&lt;/ul&gt;So I will show you the detail of it at here:&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/_oM6crbW6VWA/S9KFgQ8M2CI/AAAAAAAAAE8/441NvXZ-52g/s1600/ConvertET_9_2_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S9KFgQ8M2CI/AAAAAAAAAE8/441NvXZ-52g/s640/ConvertET_9_2_2.png" width="640" /&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;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KFoRyGrTI/AAAAAAAAAFE/SH5phbvOlRo/s1600/ConvertET_9_3_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="442" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KFoRyGrTI/AAAAAAAAAFE/SH5phbvOlRo/s640/ConvertET_9_3_3.png" width="640" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&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/_oM6crbW6VWA/S9KFucAWCRI/AAAAAAAAAFM/k-GgX53snwE/s1600/ConvertET_9_4_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="342" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S9KFucAWCRI/AAAAAAAAAFM/k-GgX53snwE/s640/ConvertET_9_4_4.png" width="640" /&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;&lt;br /&gt;&lt;br /&gt;And the finally, we shall wrap it into a helper function at here:&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/_oM6crbW6VWA/S9KF6ccl_SI/AAAAAAAAAFU/NHeyc-fR_9c/s1600/ConvertET_9_1_1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://3.bp.blogspot.com/_oM6crbW6VWA/S9KF6ccl_SI/AAAAAAAAAFU/NHeyc-fR_9c/s640/ConvertET_9_1_1.png" width="640" /&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;In the unit testing, I executed unit testing for this and the result is:&lt;br /&gt;&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/_oM6crbW6VWA/S9KHFJPcw5I/AAAAAAAAAFc/ggDgV-HDkRs/s1600/ConvertET_10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://1.bp.blogspot.com/_oM6crbW6VWA/S9KHFJPcw5I/AAAAAAAAAFc/ggDgV-HDkRs/s640/ConvertET_10.png" width="640" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IMHO, Maybe have many method for this convert, but It's my work, and I really appreciate to anyone who comment for improving my post. Thanks!&lt;br /&gt;&lt;br /&gt;You can reference to&amp;nbsp;&lt;a href="http://geekswithblogs.net/Martinez/articles/understanding-expression-trees.aspx"&gt;http://geekswithblogs.net/Martinez/articles/understanding-expression-trees.aspx&lt;/a&gt;&amp;nbsp;for clear more about Expression Tree..&lt;br /&gt;@&lt;a href="http://geekswithblogs.net/Martinez"&gt;Martinez&lt;/a&gt;: Really thank about your articles!&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-591101272663714605?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/591101272663714605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/04/converting-expression-tree.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/591101272663714605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/591101272663714605'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/04/converting-expression-tree.html' title='Converting Expression Tree'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oM6crbW6VWA/S9J2buwTQ9I/AAAAAAAAAEM/hFaJkucmMFQ/s72-c/ConvertET_1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-8011417109615864949</id><published>2010-04-20T00:50:00.000-07:00</published><updated>2010-04-20T20:32:49.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><title type='text'>Mocking the Lambda Expression method</title><content type='html'>Today, when trying to unit testing for some code in Specification class, I just found that "It's very difficult to mock the Lambda Expression in code". But I also try mocking it in 2 hours and I mocked it perfectly (:D). And my work start now&lt;br /&gt;&lt;br /&gt;+ First thing I have the class as:&lt;br /&gt;&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/_oM6crbW6VWA/S81YDnuzIxI/AAAAAAAAAD4/1fueRm9Faac/s1600/ExpressionUnitTesting_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://1.bp.blogspot.com/_oM6crbW6VWA/S81YDnuzIxI/AAAAAAAAAD4/1fueRm9Faac/s640/ExpressionUnitTesting_2.png" width="640" wt="true" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you see the red rectangle, we have the Lambda Expression like this Expression&lt;func&gt;&amp;lt;...&amp;gt;&amp;gt;, so we must to mock it for unit testing (I used Rhino Mock for mocking object in my test fixture). And now I want to show you the UserRespository class as below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/func&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_oM6crbW6VWA/S81aDFFKvrI/AAAAAAAAAEA/9n9LiLe31fw/s1600/ExpressionUnitTesting_3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="539" src="http://2.bp.blogspot.com/_oM6crbW6VWA/S81aDFFKvrI/AAAAAAAAAEA/9n9LiLe31fw/s640/ExpressionUnitTesting_3.png" width="640" wt="true" /&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;&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;Don't refuse about that, we only demonstrated about this function for my post. Don't care about other code in this function. We shall pass the Lambda Expression (LE)&amp;nbsp;for executing in run time. So how do you mock this LE? It's not secret for anyone, and now I will show you about it&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/_oM6crbW6VWA/S81X6csDVmI/AAAAAAAAADw/0zhSiyprt_4/s1600/ExpressionUnitTesting_1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S81X6csDVmI/AAAAAAAAADw/0zhSiyprt_4/s640/ExpressionUnitTesting_1.png" width="640" wt="true" /&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pay attention to the red rectangle, I mocked the LE using Rhino Mock. As you see, it's very simple, we only supposed that the LE is not null and expected that if it's not null we shall return true for it. IMHO maybe have many methods for mocking the LE but anyway this is my working for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-8011417109615864949?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/8011417109615864949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/04/mocking-lamda-expression-method.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8011417109615864949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8011417109615864949'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/04/mocking-lamda-expression-method.html' title='Mocking the Lambda Expression method'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oM6crbW6VWA/S81YDnuzIxI/AAAAAAAAAD4/1fueRm9Faac/s72-c/ExpressionUnitTesting_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-1752221108482918307</id><published>2010-03-30T21:24:00.000-07:00</published><updated>2010-03-31T01:00:57.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expression'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><title type='text'>Validating ViewModel use Regular Expression</title><content type='html'>What do you think about Regular Expression(RE)?&lt;br /&gt;Today, when working on RE in Validate ViewModel (used DataAnnotation), I just found important thing in RE. After reading about it, I implemented something very interested in it. &lt;br /&gt;For examples: &lt;br /&gt;In bussiness rule request me validate for string not contain any speial characters. So I can use this pattern ^[(0-9|a-z|\s|A-Z\.)]*$. It's so good. We can used &lt;a href="http://www.zytrax.com/tech/web/regex.htm#parenthesis"&gt;this tool &lt;/a&gt;for validate string.&lt;br /&gt;I also found useful stuff at &lt;a href="http://regexlib.com/CheatSheet.aspx"&gt;here&lt;/a&gt;. This is very easy for understanding. In real working, RE's really important, and it make my work is easier. But we always had some problems when using it :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-1752221108482918307?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/1752221108482918307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/03/validating-viewmodel-use-regular.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/1752221108482918307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/1752221108482918307'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/03/validating-viewmodel-use-regular.html' title='Validating ViewModel use Regular Expression'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-3878312552582068989</id><published>2010-03-25T04:30:00.000-07:00</published><updated>2010-03-25T05:31:41.872-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Principles'/><category scheme='http://www.blogger.com/atom/ns#' term='IOC'/><title type='text'>Five Rules for IOC container</title><content type='html'>Today, I found the interesting article about &lt;a href="http://blog.vuscode.com/malovicn/archive/2009/10/16/inversion-of-control-single-responsibility-principle-and-nikola-s-laws-of-dependency-injection.aspx"&gt;5 rules in using IOC container&lt;/a&gt;. And I really eager about it. In this article impressed in Service Locator is dead, and we need &lt;a href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx"&gt;saying no with it&lt;/a&gt;. That is five rules about using IOC container:&lt;br /&gt;&lt;br /&gt;+ Rule 1: Store in IoC container only services. Do not store any entities&lt;br /&gt;+ Rule 2: Any class having more then 3 dependencies should be questioned for SRP violation&lt;br /&gt;+ Rule 3: Every dependency of the class has to be presented in a transparent manner in a class constructor&lt;br /&gt;+ Rule 4: Every constructor of a class being resolved should not have any implementation other then accepting a set of its own dependencies&lt;br /&gt;+ Rule 5: IoC container should be explicitly used only in Bootstrapper. Any other “IoC enabled” code (including the unit tests) should be completely agnostic about the existence of IoC container&lt;br /&gt;&lt;br /&gt;Inspite of it really old, publishing in 2009 but this article have something that I interested in. And we need make sense about &lt;a href="http://blog.vuscode.com/malovicn/archive/2008/06/08/design-for-testability-transparent-and-opaque-dependencies-part-8.aspx"&gt;Opaque dependencies and Tranparent Dependencies&lt;/a&gt;. What happen here if I use opaque denpendencies? It's make your class very hard for unit testing because it's seen hidden dependency class in your class. So you don't know to testing your class anywhere.In this articles of Mark Seemann, he's only showed for us about Oquaque Dependencies and he talked Service Locator is anti-pattern. But according to me, if we can use Transparent Dependencies, we can realize that Service Locator still use in the other context, and make your class don't know anything about existence Service Locator on it. In &lt;a href="http://blog.ploeh.dk/CategoryView,category,DependencyInjection.aspx"&gt;this articles&lt;/a&gt;, &lt;strong&gt;malovicn&lt;/strong&gt; also showed for us about using internal key word for internal constructor, it's really useful for us when design the class that using Service Locator&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-3878312552582068989?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/3878312552582068989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/03/today-i-found-interesting-article-about.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/3878312552582068989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/3878312552582068989'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/03/today-i-found-interesting-article-about.html' title='Five Rules for IOC container'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-2348338617016327434</id><published>2010-03-04T19:06:00.000-08:00</published><updated>2010-03-04T19:13:03.447-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Service'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Differences between Custom Service and RESTful service</title><content type='html'>Up to before read &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd882522.aspx"&gt;this articles&lt;/a&gt; in MSDN magazines, I still know very implicit about RESTful service and Custom Service. Now I can define it as "&lt;span style="font-weight:bold;"&gt;Custom service is define orient-operator and RESTful service is define orient-resources&lt;/span&gt;". It's really make me clearly about ADO.NET Data services. And I think it will be development in the future (.NET 4 and Entity framework 4)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-2348338617016327434?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/2348338617016327434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/03/differences-between-custom-service-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2348338617016327434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2348338617016327434'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/03/differences-between-custom-service-and.html' title='Differences between Custom Service and RESTful service'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-6441623110876762473</id><published>2010-02-12T06:53:00.000-08:00</published><updated>2010-02-12T06:56:56.378-08:00</updated><title type='text'>Active Directory Role Provider</title><content type='html'>Time passed very past. Today, it's very near Tet holiday. And I found a article from Mr. Thoai Nguyen, my co-worker at Hvn. It's really cool and useful for my work at company. I want to shared to all you about it. Click &lt;a href="http://slalomdev.blogspot.com/2008/08/active-directory-role-provider.html"&gt;here &lt;/a&gt;for it&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-6441623110876762473?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/6441623110876762473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/02/active-directory-role-provider.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6441623110876762473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6441623110876762473'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/02/active-directory-role-provider.html' title='Active Directory Role Provider'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-5480424699480260199</id><published>2010-01-25T02:56:00.000-08:00</published><updated>2010-01-25T03:02:08.149-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Principles'/><title type='text'>S.O.L.I.D principles</title><content type='html'>S: The Single Responsibility Principle&lt;br /&gt;O: The Open Closed Principle&lt;br /&gt;L: The Liskov Substitution Principle&lt;br /&gt;I: Interface Segregation Principle&lt;br /&gt;D: The Dependency Inversion Principle&lt;br /&gt;&lt;br /&gt;Five principles that made the OOP world is re-use and easily maintain. &lt;br /&gt;All thing is found by &lt;a href="http://www.objectmentor.com/resources/articles"&gt;Robert Martin&lt;/a&gt; (a.k.a. Uncle Bob). And today, i find a link that write very good about S.O.L.I.D principles. You can find this at &lt;a href="http://p2p.wrox.com/content/articles/design-and-test-driven-development"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-5480424699480260199?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/5480424699480260199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/solid-principles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/5480424699480260199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/5480424699480260199'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/solid-principles.html' title='S.O.L.I.D principles'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-6387386522092667660</id><published>2010-01-22T00:10:00.000-08:00</published><updated>2010-01-22T00:28:23.903-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLSERVER'/><title type='text'>How to references mutilple databases in SQL Server 2005</title><content type='html'>Today, when working with SQL Server 2005, I have a issue. This situation as "I have a select statement that references to multiple tables that reside in 2 different database". After finding in internet and helping from my team leader, I found a solution as below;&lt;br /&gt;&lt;br /&gt;+ Using Synonyms in SQL Server 2005 for taking references to other database (other database server)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;USE "Database using references";&lt;br /&gt;GO&lt;br /&gt;IF OBJECT_ID('dbo.OrgUnit', 'SN') IS NOT NULL&lt;br /&gt;  DROP SYNONYM dbo.OrgUnit;&lt;br /&gt;GO&lt;br /&gt;CREATE SYNONYM dbo.OrgUnit FOR ["name of database referenced"].security.orgunit.OrgUnit;&lt;br /&gt;&lt;br /&gt;select * from dbo.OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note: &lt;span style="font-style:italic;"&gt;I you want to know about "name of database referenced", using as&lt;br /&gt;select * from sys.servers&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;+ Adding:&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;USE master;&lt;br /&gt;GO&lt;br /&gt;EXEC sp_addlinkedserver &lt;br /&gt;   '"IP Address"',&lt;br /&gt;   N'SQL Server'&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;+ And now you can select the table that reside in the other location as&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;USE "Database using references";&lt;br /&gt;GO;&lt;br /&gt;select * from dbo.OrgUnit&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Assume we have [Client] database at local and [Security] database at the remote side&lt;br /&gt;&lt;br /&gt;USE master;&lt;br /&gt;GO&lt;br /&gt;EXEC sp_addlinkedserver &lt;br /&gt;   'SECURITY_DATABASE_ADDRESS',&lt;br /&gt;   N'SQL Server'&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;select * from sys.servers&lt;br /&gt;&lt;br /&gt;USE Client;&lt;br /&gt;GO&lt;br /&gt;IF OBJECT_ID('dbo.OrgUnit', 'SN') IS NOT NULL&lt;br /&gt;  DROP SYNONYM dbo.OrgUnit;&lt;br /&gt;GO&lt;br /&gt;CREATE SYNONYM dbo.OrgUnit FOR [SECURITY_DATABASE_ADDRESS].security.orgunit.OrgUnit;&lt;br /&gt;&lt;br /&gt;select * from dbo.OrgUnit&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-6387386522092667660?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/6387386522092667660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/how-to-references-mutilple-databases-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6387386522092667660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6387386522092667660'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/how-to-references-mutilple-databases-in.html' title='How to references mutilple databases in SQL Server 2005'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-2870162165831064653</id><published>2010-01-19T23:37:00.000-08:00</published><updated>2010-01-19T23:49:59.081-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><title type='text'>Thinking about Patterns in ASP.NET for developer</title><content type='html'>Today, when try to finding about pattern, I found the new series articles about patterns for developer. It's really attractive me for exploring pattern in ASP.NET.&lt;br /&gt;&lt;br /&gt;This is a three parts: &lt;a href="http://www.devx.com/dotnet/Article/33695"&gt;part 1&lt;/a&gt;, &lt;a href="http://www.devx.com/dotnet/Article/33889"&gt;part 2&lt;/a&gt; and &lt;a href="http://www.devx.com/dotnet/Article/34220/0/page/1"&gt;part 3&lt;/a&gt; at &lt;a href="http://devx.com"&gt;http://devx.com&lt;/a&gt;&lt;br /&gt;And this is a some pattern that apply for ASP.NET website at&lt;a href="http://www.developerfusion.com"&gt; http://www.developerfusion.com&lt;/a&gt; &lt;a href="http://www.developerfusion.com/article/8307/aspnet-patterns-every-developer-should-know/"&gt;here&lt;/a&gt; and &lt;a href="http://www.developerfusion.com/article/8307/aspnet-patterns-every-developer-should-know/2/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe, It's not new (because publish in 2007) but as me this very useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-2870162165831064653?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/2870162165831064653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/thinking-about-patterns-in-aspnet-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2870162165831064653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2870162165831064653'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/thinking-about-patterns-in-aspnet-for.html' title='Thinking about Patterns in ASP.NET for developer'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-6195962380823716533</id><published>2010-01-19T01:51:00.000-08:00</published><updated>2010-01-19T02:01:08.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><title type='text'>Post, Redirect, Get Pattern in ASP.NET MVC</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oM6crbW6VWA/S1WB3awIF2I/AAAAAAAAACY/GXAtFSzIzVo/s1600-h/post_redirect_get_1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 260px; height: 166px;" src="http://1.bp.blogspot.com/_oM6crbW6VWA/S1WB3awIF2I/AAAAAAAAACY/GXAtFSzIzVo/s320/post_redirect_get_1.png" alt="" id="BLOGGER_PHOTO_ID_5428387714938967906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The ASP.NET MVC pattern tends to lead itself into a more simplified and "true" HTTP experience by re-introducing  patterns that have been lost, or at least, not followed in many years. One such pattern is the Post, Redirect, Get (PRG) pattern in which it is "to help avoid duplicate form submissions and allow web applications to behave more intuitively with browser bookmarks and the reload button" (&lt;a href="http://en.wikipedia.org/wiki/Post/Redirect/Get"&gt;Wikipedia&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A normal ASP.NET Web Form Lifecycle has the following pattern&lt;br /&gt;&lt;br /&gt;  1. HTTP GET of "Create.aspx"&lt;br /&gt;  2. HTTP POST of "Create.aspx"&lt;br /&gt;  3. Validation Fails, "Create.aspx" is Re-Rendered&lt;br /&gt;  4. HTTP POST of "Create.aspx"&lt;br /&gt;  5. Item is created, "Create.aspx" is Re-Rendered with confirmation message&lt;br /&gt;&lt;br /&gt;The major problems with this Postback pattern, is that hitting the Refresh button of your browser in steps 3 or 5 will re-post your submitted data. Step 5 is more of a problem as it could possibly re-submit that created information. Granted, there are steps that you can take to approach this problem, but this is how default ASP.NET Web Forms are treated.&lt;br /&gt;&lt;br /&gt;Taking this same approach within ASP.NET MVC, can be achieved in the same manner by rendering a your "Create" view from your POST action. For example:&lt;br /&gt;&lt;br /&gt;  1. HTTP GET of "/products/create", "Create" view is rendered&lt;br /&gt;  2. HTTP POST to "/products/submit"&lt;br /&gt;  3. Validation Fails, "Create" view is rendered&lt;br /&gt;  4. HTTP POST to "/products/submit"&lt;br /&gt;  5. Item is created, "Confirm" view is rendered&lt;br /&gt;&lt;br /&gt;As you'll notice, the same problems we had with ASP.NET Web Forms exists with ASP.NET MVC. The really nice option, is that ASP.NET MVC gives you a lot more "freedom" of how the workflow is processed. If we strictly follow the PRG pattern within ASP.NET MVC, it would look something like&lt;br /&gt;&lt;br /&gt;  1. HTTP GET of "/products/create", "Create" view is rendered&lt;br /&gt;  2. HTTP POST to "/products/submit"&lt;br /&gt;  3. Validation Fails, redirect to "/products/create", "Create" view is rendered&lt;br /&gt;  4. HTTP POST to "/products/submit"&lt;br /&gt;  5. Item is created, redirect to "/products/confirm", "Confirm" view is rendered&lt;br /&gt;&lt;br /&gt;As you'll notice, where we previously could have had issues in step 3 or 5 before, we no longer have issues. If a user presses the Refresh button in either of those steps, they'll not get the lovely "Would you like to resubmit the form data" confirmation as featured below - instead, the page just reloads.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oM6crbW6VWA/S1WCGCosUII/AAAAAAAAACg/kLl6EFjdJCc/s1600-h/post_redirect_get_2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 75px;" src="http://4.bp.blogspot.com/_oM6crbW6VWA/S1WCGCosUII/AAAAAAAAACg/kLl6EFjdJCc/s320/post_redirect_get_2.png" alt="" id="BLOGGER_PHOTO_ID_5428387966163374210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All detail information, please go &lt;a href="http://www.blogger.com/ASP.NET%20MVC%20-%20Using%20Post,%20Redirect,%20Get%20Pattern"&gt;ASP.NET MVC - Using Post, Redirect, Get Pattern&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-6195962380823716533?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/6195962380823716533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/post-redirect-get-pattern-in-aspnet-mvc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6195962380823716533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/6195962380823716533'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/post-redirect-get-pattern-in-aspnet-mvc.html' title='Post, Redirect, Get Pattern in ASP.NET MVC'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oM6crbW6VWA/S1WB3awIF2I/AAAAAAAAACY/GXAtFSzIzVo/s72-c/post_redirect_get_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-8649508143470071059</id><published>2010-01-18T22:25:00.000-08:00</published><updated>2010-01-18T22:32:09.494-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>WCF Error - The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state</title><content type='html'>While working on a WCF service, I ran into the following error.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;The communication object, System.ServiceModel.Channels.ServiceChannel,cannot be used for communication because it is in the Faulted state.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This occurred when called Close method on instance of my WCF service client object. For a moment it took me by surprise. The code has been working fine and I was doing the right thing of closing connection to my WCF service after I was done using it. When I looked at the stack trace, I realized that it got thrown from a finally block of a method where I was calling a method on my WCF object. And before that there was an exception thrown. After further investigation it turned out that my WCF service was not running. So when I called method on the object, I got EndpointNotFoundException exception thrown when method was called. And in the same exception handling block I tried to call Close on client object. Since the client was already in bad state so next exception was thrown. So as a best practice, before you call Close method on your service object, check if its in Open state or not. This is exactly like a database connection object where you can check if its in open state or not. The following code snippet shows the change that I made to check for state of the WCF client object.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if (_serviceClient.State == CommunicationState.Opened)&lt;br /&gt;{&lt;br /&gt;_serviceClient.Close();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-8649508143470071059?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/8649508143470071059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/wcf-error-communication-object.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8649508143470071059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/8649508143470071059'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/wcf-error-communication-object.html' title='WCF Error - The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6516582153992491495.post-2094477616124248753</id><published>2010-01-17T19:16:00.000-08:00</published><updated>2010-01-17T19:18:18.133-08:00</updated><title type='text'>The first post in blogspot</title><content type='html'>I will try to make some thing that i learned from Internet (certainly about OOP)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6516582153992491495-2094477616124248753?l=thangcq.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thangcq.blogspot.com/feeds/2094477616124248753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thangcq.blogspot.com/2010/01/first-post-in-blogspot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2094477616124248753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6516582153992491495/posts/default/2094477616124248753'/><link rel='alternate' type='text/html' href='http://thangcq.blogspot.com/2010/01/first-post-in-blogspot.html' title='The first post in blogspot'/><author><name>thangchung</name><uri>http://www.blogger.com/profile/08042461140009548542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://3.bp.blogspot.com/_oM6crbW6VWA/TPkoebGe_TI/AAAAAAAAAn0/Z-uznu7qvJA/S220/ThangChung.JPG'/></author><thr:total>0</thr:total></entry></feed>
