<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Radenko Zec Blog</title>
    <description>Silverlight, C#, WCF, WPF,NET...</description>
    <link>http://blog.developers.ba/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.5.0.6</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://blog.developers.ba/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://feeds2.feedburner.com/RadenkoZecBlog</blogChannel:blink>
    <dc:creator>Radenko Zec</dc:creator>
    <dc:title>Radenko Zec Blog</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RadenkoZecBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="radenkozecblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Request throttling in ASP.NET Web API</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Real world scenario&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;When you start to build real world REST API you will surely try to limit access to you API. You can limit number of concurrent requests by using &lt;a href="http://www.iis.net/download/dynamiciprestrictions"&gt;http://www.iis.net/download/dynamiciprestrictions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or some other tools.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In this post I will try to limit access to my ASP.NET Web API by using my own code building my own custom DelegatingHandler.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;What you will see here&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In this code bellow is ThrottleRateHandler that will be used to limit number of calls to your API in hour. Also these same code will limit how many times you can call API in seconds.&lt;/p&gt;
&lt;p&gt;These class is using code similar as StackOverflow has used for their throttle rate handler.&lt;/p&gt;
&lt;p&gt;Also these code is based on Token authorization approach.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I will also use HTTPRuntime.Cache to implement this functionality. I plan for my real world REST API to use MemBase caching. So question for my readers: Is it smart to replace HTTPRuntime.Cache with MemBase later ?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is code for ThrottleRateHandler :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class ThrottleRateHandler : DelegatingHandler
    {
        protected override Task&amp;lt;HttpResponseMessage&amp;gt; SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            string query = request.RequestUri.Query;
            string accessToken = HttpUtility.ParseQueryString(query).Get("accessToken");
            double seconds = Convert.ToDouble(WebConfigurationManager.AppSettings["throttleTimeoutForMethodCall"]);
            int numberRequests = Convert.ToInt32(WebConfigurationManager.AppSettings["tokenRequestsPerHour"]);

            if (accessToken != null)
            {
                var throttleKey = string.Format(
                    "{0}-{1}", request.RequestUri.AbsolutePath, accessToken);
                var tokenKey = accessToken;
                var allowExecute = false;

                if (HttpRuntime.Cache[throttleKey] == null)
                {
                    // this check was added for integration testing
                    if (!seconds.Equals(0.0))
                    {
                        HttpRuntime.Cache.Add(
                            throttleKey,
                            true,
                            null,
                            DateTime.Now.AddSeconds(seconds),
                            Cache.NoSlidingExpiration,
                            CacheItemPriority.Low,
                            null);
                    }

                    allowExecute = true;
                }

                if (allowExecute)
                {
                    var hit = (HitInfo)(HttpRuntime.Cache[tokenKey] jQuery152020203585348297026_1330795835814 new HitInfo());

                    if (hit.Hits &amp;gt; numberRequests)
                    {
                        allowExecute = false;
                    }
                    else
                    {
                        hit.Hits++;
                    }

                    if (hit.Hits == 1)
                    {
                        HttpRuntime.Cache.Add(
                            tokenKey,
                            hit,
                            null,
                            DateTime.Now.AddMinutes(60),
                            Cache.NoSlidingExpiration,
                            CacheItemPriority.AboveNormal,
                            null);
                    }

                    if (!allowExecute)
                    {
                        return this.ReturnException(string.Format("You can call API {0} times per hour", numberRequests));
                    }
                }
                else
                {
                   return this.ReturnException(string.Format("You can call API every {0} seconds", seconds));
                }
            }
            else
            {
                var response = new HttpResponseMessage
                {
                    Content =
                        new StringContent("You must supply valid token to access method!"),
                    StatusCode = HttpStatusCode.Unauthorized
                };
                return Task&amp;lt;HttpResponseMessage&amp;gt;.Factory.StartNew(() =&amp;gt; response);
            }

            return base.SendAsync(request, cancellationToken);
        }

        private Task&amp;lt;HttpResponseMessage&amp;gt; ReturnException(string message)
        {
            var response = new HttpResponseMessage
            {
                Content = new StringContent(message),
                StatusCode = HttpStatusCode.Conflict
            };
            return Task&amp;lt;HttpResponseMessage&amp;gt;.Factory.StartNew(() =&amp;gt; response);
        }

        public class HitInfo
        {
            public HitInfo()
            {
                Hits = 1;
            }

            public string Token { get; set; }
            public int Hits { get; set; }
        }
    }
}&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/zY09A_77H6E" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2012/03/03/Request-throttling-in-ASPNET-Web-API.aspx</link>
      <comments>http://blog.developers.ba/post/2012/03/03/Request-throttling-in-ASPNET-Web-API.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=4eeee5cf-116b-4830-a2d7-f633ea85a6fb</guid>
      <pubDate>Sat, 03 Mar 2012 06:29:00 -1000</pubDate>
      <category>ASP.net</category>
      <category>ASP.NET Web API</category>
      <category>C#</category>
      <category>General programming</category>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=4eeee5cf-116b-4830-a2d7-f633ea85a6fb</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=4eeee5cf-116b-4830-a2d7-f633ea85a6fb</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2012/03/03/Request-throttling-in-ASPNET-Web-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=4eeee5cf-116b-4830-a2d7-f633ea85a6fb</wfw:commentRss>
    </item>
    <item>
      <title>ASP.NET Web API Authorization using Tokens</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Planning real world REST API&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;When you try to plan how to build real world REST API like other major players like Facebook or Foursquare have you will soon realize that all major players use OAuth 2.0 .&lt;/p&gt;
&lt;p&gt;ASP.NET Web API comes with support for &lt;strong&gt;authorize attribute&lt;/strong&gt; and &lt;span style="text-decoration: underline;"&gt;that&amp;rsquo;s nice&lt;/span&gt;, but for real world API I want to support token based approach.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;OAuth 2.0 Server&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For supporting token based approach&amp;nbsp; you must have some kind of server that will issue tokens. Building token server can be complex and most major players have implemented OAuth 2.0 server based on draft 10 OAuth documentation.&lt;/p&gt;
&lt;p&gt;We hope that Microsoft will provide us with their own OAuth 2.0 server for free in final version of ASP.NET MVC 4.&lt;/p&gt;
&lt;p&gt;Meanwhile I will just assume that you already have your own OAuth 2.0 server.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Building ActionFilterAttribute&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have solved my problem with authorization by implementing RequireAuthorize ActionFilterAttribute. This attribute also have scope property. Scope property is used for limiting access to your REST API.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You just need to decorate controllers or actions in controllers with this attribute and optionally set required scope for accessing these actions.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is RequireAuthorizeAtribute:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class RequireAuthorization : ActionFilterAttribute
    {
        public string Scope { get; set; }

        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            string[] scope = null;
            if (!string.IsNullOrEmpty(Scope))
            {
                scope = Scope.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            }

            string query = actionContext.Request.RequestUri.Query;
            string accessToken = HttpUtility.ParseQueryString(query).Get("accessToken");

            // we first check for valid token
            if (accessToken != null)
            {
                IAccessTokenValidator accessTokenValidator = new AccessTokenValidator();
                bool validToken = accessTokenValidator.ValidateToken(accessToken, scope);

                if (!validToken)
                {
                    var response = new HttpResponseMessage
                    {
                        Content =
                            new StringContent("This token is not valid, please refresh token or obtain valid token!"),
                        StatusCode = HttpStatusCode.Unauthorized
                    };
                    throw new HttpResponseException(response);
                }
            }
            else
            {
                var response = new HttpResponseMessage
                {
                    Content =
                        new StringContent("You must supply valid token to access method!"),
                    StatusCode = HttpStatusCode.Unauthorized
                };
                throw new HttpResponseException(response);
            }

            base.OnActionExecuting(actionContext);
        }
    }&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;And here is AccessTokenValidator class:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class AccessTokenValidator : IAccessTokenValidator
    {
        public bool ValidateToken(string token, string[] scope)
        {
            // replace this logic with dataBase access to table with tokens
            if (token != "someToken")
            {
                return false;
            }
            return true;
        }
    }&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/QP5S3QleBZc" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2012/03/03/ASPNET-Web-API-Authorization-using-Tokens.aspx</link>
      <comments>http://blog.developers.ba/post/2012/03/03/ASPNET-Web-API-Authorization-using-Tokens.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=fb58dcf1-02c9-4d3d-a271-01d564258d44</guid>
      <pubDate>Sat, 03 Mar 2012 06:02:00 -1000</pubDate>
      <category>ASP.NET Web API</category>
      <category>C#</category>
      <category>General programming</category>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=fb58dcf1-02c9-4d3d-a271-01d564258d44</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=fb58dcf1-02c9-4d3d-a271-01d564258d44</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2012/03/03/ASPNET-Web-API-Authorization-using-Tokens.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=fb58dcf1-02c9-4d3d-a271-01d564258d44</wfw:commentRss>
    </item>
    <item>
      <title>Force JSON DelegatingHandler for ASP.NET Web API</title>
      <description>&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Building real world REST API-s&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;When you decide to build real world REST API-s like Facebook or Foursquare and many others have you must think on lot of things such as security, scoping, throttling and similar.&lt;/p&gt;
&lt;p&gt;One of the first thing you will encounter is need to support various media formats such as JSON, XML, PNG &amp;hellip; in easy way.&lt;/p&gt;
&lt;p&gt;ASP.NET Web API support JSON and XML formats out of the box and provide us with easy way to support any custom mediaType format.&lt;/p&gt;
&lt;p&gt;I will try to provide you with series of posts in which I will try to explain how I have created real world REST API using ASP.NET Web API.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Common ways to enforce custom format&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are several ways to enforce custom format in REST API :&lt;/p&gt;
&lt;p&gt;1) You can pass mediaType in request header .&lt;/p&gt;
&lt;p&gt;2) You can pass mediaType in URI using following syntax : &lt;a href="http://api.mySite.com/v1/contacts/1/JSON"&gt;http://api.mySite.com/v1/contacts/1/JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3) You can pass mediaType in URI using following syntax : &lt;a href="http://api.mySite.com/v1/contacts/1.JSON"&gt;http://api.mySite.com/v1/contacts/1.JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4) You can pass mediaType in URI using following syntax : &lt;a href="http://api.mySite.com/v1/contacts/1?mediaType=JSON"&gt;http://api.mySite.com/v1/contacts/1?mediaType=JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;My preferred solution using ASP.NET Web API&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&lt;strong&gt;First approach &amp;ndash; I will support&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In REST API you will sure want to support first approach in which user passes mediaType in request header.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&lt;strong&gt;Second approach &amp;ndash; I will not support&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For second approach things are little difficult .&lt;/p&gt;
&lt;p&gt;To support this way you will probably need to change routes like this where you pass optional parameter ext for mediaType extension :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;config.Routes.MapHttpRoute(
                "Default", 
                "{controller}/{id}/{ext}", 
                new { id = RouteParameter.Optional, ext = RouteParameter.Optional } 
            );&lt;/pre&gt;
&lt;p&gt;Problem with this approach is that your code will only work for URI like this where you try to get particular contact with id 1 in JSON format:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://api.mySite.com/v1/contacts/1/JSON"&gt;http://api.mySite.com/v1/contacts/1/JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you try to get all contacts in JSON format using URI like this it will fail:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://api.mySite.com/v1/contacts/JSON"&gt;http://api.mySite.com/v1/contacts/JSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Instead of trying to get all contacts in that format in will try to find contact which has id with value &amp;ldquo;JSON&amp;rdquo; .&lt;/p&gt;
&lt;p&gt;One possible way to resolve this is to have two controllers for same model. One called ContactController another ContactsController.&lt;/p&gt;
&lt;p&gt;I just don&amp;rsquo;t prefer this solution. If you know any other solution to resolve this feel free to comment. You can read more about this in this sites :&lt;/p&gt;
&lt;p&gt;&lt;a title="http://codebetter.com/glennblock/2012/02/28/why-are-there-2-controllers-in-the-asp-net-web-api-contactmanager-example-rest-has-nothing-to-with-it-2/" href="http://codebetter.com/glennblock/2012/02/28/why-are-there-2-controllers-in-the-asp-net-web-api-contactmanager-example-rest-has-nothing-to-with-it-2/"&gt;http://codebetter.com/glennblock/2012/02/28/why-are-there-2-controllers-in-the-asp-net-web-api-contactmanager-example-rest-has-nothing-to-with-it-2/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://wekeroad.com/2012/02/28/someone-save-us-from-rest/" href="http://wekeroad.com/2012/02/28/someone-save-us-from-rest/"&gt;http://wekeroad.com/2012/02/28/someone-save-us-from-rest/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&lt;strong&gt;Third approach &amp;ndash; I will not support&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You may be wondering why it is so nice and clean? I don&amp;rsquo;t like dots in URI in that way. You cannot parse that QueryString safely to get that extensions behind dot.&lt;/p&gt;
&lt;p&gt;You can try do something like this :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;requestString.EndsWith(".JSON")&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family: Verdana;"&gt;But then you will get another wall. In this version of ASP.NET Web API when you try to change Request.RequestUri&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;inside DelegatingHandlers method SendAsync and pass changed RequestUri to base, ASP.NET Web API still try to go&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;to old RequestUri. It seams like routing is performed before DelegatingHandler&amp;hellip;&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;So if we try to get mediaType in DelegatingHandler from RequestUri :&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;a href="http://api.mySite.com/v1/contacts/1.JSON"&gt;http://api.mySite.com/v1/contacts/1.JSON&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family: verdana,geneva;"&gt;then substring URI to become:&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;a href="http://api.mySite.com/v1/contacts/1"&gt;http://api.mySite.com/v1/contacts/1&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family: verdana,geneva;"&gt;and pass new RequestUri to base we will not be successful.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&lt;span style="font-family: Verdana;"&gt;&lt;strong&gt;Fourth approach &amp;ndash; I will support&lt;/strong&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I have choose to support fourth approach. For using this approach you will need to add this line of code in GlobalAsax.cs :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;config.MessageHandlers.Add(new UriFormatExtensionMessageHandler());&lt;/pre&gt;
&lt;p&gt;Here is my code for UriFormatExtensionMessageHandler :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class UriFormatExtensionMessageHandler : DelegatingHandler
   {    
       private bool shouldForceJson;
       private bool sholudForceXml;
       public void CheckFormats(HttpRequestMessage request)
       {
           // uri must contain mediaType parameter to enforce that media type
           string query = request.RequestUri.Query;
           string mediaType = HttpUtility.ParseQueryString(query).Get("mediaType");
           if (mediaType != null)
           {
               switch (mediaType)
               {
                   case "JSON":
                       shouldForceJson = true;
                       break;
                   case "XML":
                       sholudForceXml = true;
                       break;
               }
           }
       }

protected override System.Threading.Tasks.Task&amp;lt;HttpResponseMessage&amp;gt; SendAsync(HttpRequestMessage request, 
System.Threading.CancellationToken cancellationToken)
       {
           CheckFormats(request);
           if (shouldForceJson)
           {
               // clear the accept and replace it to use JSON.
               request.Headers.Accept.Clear();
               request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
               shouldForceJson = false;
           }

           if (sholudForceXml)
           {
               request.Headers.Accept.Clear();
               request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
               sholudForceXml = false;
           }
             
           return base.SendAsync(request, cancellationToken);
       }
   }&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;UPDATE :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For fourth approach Microsoft has provided solution in this version of WebApi.You should you code bellow :&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;config.Formatters.JsonFormatter.MediaTypeMappings.Add(
              new QueryStringMapping("mediaType", "json", "application/json"));

            config.Formatters.XmlFormatter.MediaTypeMappings.Add(
               new QueryStringMapping("mediaType", "xml", "application/xml"));&lt;/pre&gt;
&lt;pre class="brush: c-sharp;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/v7tuzHNSa_4" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2012/03/03/Force-JSON-DelegatingHandler-for-ASPNET-Web-API.aspx</link>
      <comments>http://blog.developers.ba/post/2012/03/03/Force-JSON-DelegatingHandler-for-ASPNET-Web-API.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=5498ee4e-5ae6-4e22-ba53-6bb85d0eaf92</guid>
      <pubDate>Sat, 03 Mar 2012 02:44:00 -1000</pubDate>
      <category>ASP.NET Web API</category>
      <category>C#</category>
      <category>General programming</category>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=5498ee4e-5ae6-4e22-ba53-6bb85d0eaf92</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=5498ee4e-5ae6-4e22-ba53-6bb85d0eaf92</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2012/03/03/Force-JSON-DelegatingHandler-for-ASPNET-Web-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=5498ee4e-5ae6-4e22-ba53-6bb85d0eaf92</wfw:commentRss>
    </item>
    <item>
      <title>Blog Redesign</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Blog design revamped&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have decided after long period of not blogging to start over again and best thing you can do for fresh start is to redesign your blog. My choice this time is light background instead of dark background. It seams at least for me that is easier to read and focus on content on light backgrounds. This is tiny screenshot how my old blog looked like :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.developers.ba/image.axd?picture=clip_image001_1.jpg"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image001" src="http://blog.developers.ba/image.axd?picture=clip_image001_thumb_1.jpg" alt="clip_image001" width="244" height="160" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have also tried to incorporate minimalistic approach but I don&amp;rsquo;t know if I have succeeded.&lt;/p&gt;
&lt;p&gt;Because I am not designer I have hired designer to do all work for me. You will be able to contact him soon if you want by link in bottom of page &amp;ldquo;Designed by&amp;hellip;&amp;rdquo; that I will insert in few days.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Migrate old content to new design&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have decided to not migrate old blog content to new design. What I am mean by migrate is to change &amp;ldquo;Syntax highlighting&amp;rdquo; for code, reposition pictures, content and insert missing H1,H2 headers for some posts and similar.&lt;/p&gt;
&lt;p&gt;Because this is fresh start I want to start fresh and not go back to old content.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;My writing focus&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;My old readers probably are aware that my focus was Silverlight and .NET development. I will continue to have focus on &lt;strong&gt;&lt;em&gt;Silverlight&lt;/em&gt;&lt;/strong&gt; because Silverlight probably will remain best technology for development intranet browser applications for long time.&lt;/p&gt;
&lt;p&gt;I will also have strong focus on &lt;strong&gt;&lt;em&gt;Kinect&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Azure&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Windows Phone&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Win 8&lt;/em&gt;&lt;/strong&gt; development.&lt;/p&gt;
&lt;p&gt;I have worked on some projects that involve these technologies and I will try to write about things I have learned on this blog.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Your comments?&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;What do you think about my new blog design and choice of my writing focus ?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/70Ypxz26BRU" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2011/10/07/Blog-Redesign.aspx</link>
      <comments>http://blog.developers.ba/post/2011/10/07/Blog-Redesign.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=40610705-a859-4677-b204-171b437764ae</guid>
      <pubDate>Fri, 07 Oct 2011 22:58:00 -1000</pubDate>
      <category>General programming</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=40610705-a859-4677-b204-171b437764ae</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=40610705-a859-4677-b204-171b437764ae</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2011/10/07/Blog-Redesign.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=40610705-a859-4677-b204-171b437764ae</wfw:commentRss>
    </item>
    <item>
      <title>Virtualization in Silverlight 4 RC</title>
      <description>Here is my new article about &lt;a href="http://www.silverlightshow.net/items/Virtualization-in-Silverlight-4-RC.aspx" target="_blank" title="Virtualization in Silverlight 4 RC"&gt;Virtualization in Silverlight 4 RC&lt;/a&gt;.&lt;a href="http://www.silverlightshow.net/items/Virtualization-in-Silverlight-4-RC.aspx" target="_blank" title="Virtualization in Silverlight 4 RC"&gt; &lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/bAfsx05pTpE" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2010/03/31/Virtualization-in-Silverlight-4-RC.aspx</link>
      <comments>http://blog.developers.ba/post/2010/03/31/Virtualization-in-Silverlight-4-RC.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=37c504e0-50b7-4a44-847e-31f135099812</guid>
      <pubDate>Wed, 31 Mar 2010 06:34:00 -1000</pubDate>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=37c504e0-50b7-4a44-847e-31f135099812</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=37c504e0-50b7-4a44-847e-31f135099812</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2010/03/31/Virtualization-in-Silverlight-4-RC.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=37c504e0-50b7-4a44-847e-31f135099812</wfw:commentRss>
    </item>
    <item>
      <title>WPF Validation using Validation Application Block Part 2 – Client side</title>
      <description>&lt;p&gt;This is second part of my article where I talk about Validation in WPF using Entlib Validation Application Block. First part of my article is located on this location : &lt;a href="http://blog.developers.ba/post/2009/07/07/WPF-Validation-using-Validation-Application-Block-41-Part-1-e28093-Server-side.aspx"&gt;http://blog.developers.ba/post/2009/07/07/WPF-Validation-using-Validation-Application-Block-41-Part-1-e28093-Server-side.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are many articles about client side validation in WPF. Most of these articles are similar and use implementation of IDataErrorInfo interface on Model class.&lt;/p&gt;
&lt;p&gt;I have use some methods&amp;nbsp; already described in other articles just to show you how easy it is to implement client side validation in WPF using VAB.&lt;/p&gt;
&lt;p&gt;I have model class called Customer where I have implemented IDataErrorInfo. Code looks like this :&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border: 1px solid silver; margin: 20px 0px 10px; padding: 4px; overflow: auto; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; height: 265px; max-height: 200px; font-size: 8pt; cursor: text;"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Error
{
get {
StringBuilder error = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder();
ValidationResults results = Validation.ValidateFromAttributes&amp;lt;Customer&amp;gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);
&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (ValidationResult result &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; results)
{
error.AppendLine(result.Message);
}
&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; error.ToString() ;
}
}
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; columnName]
{
get {
ValidationResults results = Validation.ValidateFromAttributes&amp;lt;Customer&amp;gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);
&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (ValidationResult result &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; results)
{
&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (result.Key == columnName)
{
&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result.Message;
}
}
&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Empty;
}
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I have called ValidateFromAttributes method of Validation class that exists in VAB to get collection of ValidationResults. It is easy as that.&lt;/p&gt;
&lt;p&gt;In Application.Resources of my WPF application I have defined some textbox error template and style to use when validation error is occurred. For this I have borrowed some code from other articles to save on time writing templates and styles.&lt;/p&gt;
&lt;p&gt;And final in xaml on textboxes I have added following code where I have turn on Validation and defined witch error template to use :&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border: 1px solid silver; margin: 20px 0px 10px; padding: 4px; overflow: auto; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; max-height: 200px; font-size: 8pt; cursor: text;"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="txtFirstName"&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;Column&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;TextWrapping&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Wrap"&lt;/span&gt; 
&lt;span style="color: #ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{Binding FirstName, ValidatesOnDataErrors=True}"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;Validation&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;ErrorTemplate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{StaticResource TextBoxErrorTemplate}"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;References :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc700358.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/magazine/cc700358.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.eggheadcafe.com/tutorials/aspnet/f726cd7d-cfcc-43c3-85d8-2afc75e7a08a/wpf-input-validation-with.aspx" target="_blank"&gt;http://www.eggheadcafe.com/tutorials/aspnet/f726cd7d-cfcc-43c3-85d8-2afc75e7a08a/wpf-input-validation-with.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is updated code in VS2010RC :&lt;a href="http://blog.developers.ba/file.axd?file=2010%2f3%2fValidationServiceWCF.rar"&gt;ValidationServiceWCF.rar &lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/GbHogJVQA70" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2010/03/24/WPF-Validation-using-Validation-Application-Block-Part-2-e28093-Client-side.aspx</link>
      <comments>http://blog.developers.ba/post/2010/03/24/WPF-Validation-using-Validation-Application-Block-Part-2-e28093-Client-side.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=039754b6-2b09-4417-9f96-e8a99911bf67</guid>
      <pubDate>Wed, 24 Mar 2010 16:03:00 -1000</pubDate>
      <category>WPF</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=039754b6-2b09-4417-9f96-e8a99911bf67</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=039754b6-2b09-4417-9f96-e8a99911bf67</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2010/03/24/WPF-Validation-using-Validation-Application-Block-Part-2-e28093-Client-side.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=039754b6-2b09-4417-9f96-e8a99911bf67</wfw:commentRss>
    </item>
    <item>
      <title>WCF net.tcp protocol in Silverlight 4</title>
      <description>Here is my new article about WCF net.tcp protocol in Silverlight 4 &amp;nbsp;&lt;a href="http://www.silverlightshow.net/items/WCF-NET.TCP-Protocol-in-Silverlight-4.aspx"&gt;link&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/7KIvdRFELTw" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2009/12/11/WCF-nettcp-protocol-in-Silverlight-4.aspx</link>
      <comments>http://blog.developers.ba/post/2009/12/11/WCF-nettcp-protocol-in-Silverlight-4.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=7404b98a-1bf5-43a4-b32c-61080a3102b3</guid>
      <pubDate>Fri, 11 Dec 2009 14:54:00 -1000</pubDate>
      <category>Silverlight</category>
      <category>Workflow</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=7404b98a-1bf5-43a4-b32c-61080a3102b3</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=7404b98a-1bf5-43a4-b32c-61080a3102b3</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2009/12/11/WCF-nettcp-protocol-in-Silverlight-4.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=7404b98a-1bf5-43a4-b32c-61080a3102b3</wfw:commentRss>
    </item>
    <item>
      <title>Skinning and Styling Silverlight Controls</title>
      <description>&lt;p&gt;
I have a new article on about skinning and styling Silverlight Controls on Silverlightshow. Check it out on &lt;a href="http://www.silverlightshow.net/items/Skinning-and-Styling-Silverlight-Controls.aspx"&gt;link&lt;/a&gt; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/alY7twFNFGs" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2009/11/11/Skinning-and-Styling-Silverlight-Controls.aspx</link>
      <comments>http://blog.developers.ba/post/2009/11/11/Skinning-and-Styling-Silverlight-Controls.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=b10a359d-51cf-47a9-8c1e-4d792b8f4226</guid>
      <pubDate>Wed, 11 Nov 2009 05:45:00 -1000</pubDate>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=b10a359d-51cf-47a9-8c1e-4d792b8f4226</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=b10a359d-51cf-47a9-8c1e-4d792b8f4226</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2009/11/11/Skinning-and-Styling-Silverlight-Controls.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=b10a359d-51cf-47a9-8c1e-4d792b8f4226</wfw:commentRss>
    </item>
    <item>
      <title>Unit testing Facade pattern</title>
      <description>&lt;p&gt;The facade pattern is commonly used software engineering design pattern. His purpose is to provide simplified interface to a larger body of code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It has several good uses&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- Make a software library easier to use and understand, since the facade has convenient methods for common tasks. &lt;br /&gt; - Make code that uses the library more readable, for the same reason. &lt;br /&gt; - Reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system. &lt;br /&gt; - Wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Importance of this Design pattern we cannot underestimate.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In unit testing one of good practice is to put our dependencies in constructor of class. Facade pattern class however cannot have dependencies in constructor because it increase complexity of code.&lt;/p&gt;
&lt;p&gt;In this blog post I will show you how to unit test facade pattern.&lt;/p&gt;
&lt;p&gt;If I have 2 classes : EmailLogger and DatabaseLogger&amp;nbsp; and these two classes have same porpoise to Log same data.&lt;/p&gt;
&lt;p&gt;These two classes have dependencies on another classes.&lt;/p&gt;
&lt;p&gt;I want to have one class that I will call Logger with one method called Log that will be Facade for these two classes.&lt;/p&gt;
&lt;p&gt;Class EmailLogger looks like this :&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class EmailLogger:ILogger
{
private readonly IEmailProxy _emailProxy;
public EmailLogger(IEmailProxy emailProxy)
{
_emailProxy = emailProxy;
}
public void Log(string message)
{
if(_emailProxy!=null)
{
_emailProxy.SendEmail(message);
}
else
{
throw new ArgumentNullException("_emailProxy");
}
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This class have dependency on another class called EmailProxy and accepts interface IEmailProxy in constructor.&lt;/p&gt;
&lt;p&gt;Class DatabaseLogger looks similar to EmailLogger :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class DatabaseLogger:ILogger
{
private readonly IDatabaseMechanism _databaseMechanism;
public DatabaseLogger(IDatabaseMechanism databaseMechanism)
{
_databaseMechanism = databaseMechanism;
}
public void Log(string message)
{
if(_databaseMechanism!=null)
{
_databaseMechanism.SendLogToDatabase(message);
}
else
{
throw new ArgumentNullException("_databaseMechanism");
}
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This class have dependency on class called DatabaseMechanism and accepts another interface IDatabaseMechanism in constructor.&lt;/p&gt;
&lt;p&gt;And finally we have class called Logger that will be Facade for these two classes .&lt;/p&gt;
&lt;p&gt;In this example I will use singleton implementation Unity container and Rhino Mocks.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class Logger:ILogger
{
private readonly ILogger _emailLogger;
private readonly ILogger _databaseLogger;
public Logger()
{
IContainer container = new UnityContainer();
_emailLogger = container.Resolve&amp;lt;ILogger&amp;gt;("EmailLogger");
_databaseLogger = container.Resolve&amp;lt;ILogger&amp;gt;("DatabaseLogger");
}
public void Log(string message)
{
if(_emailLogger!=null)
{
_emailLogger.Log(message);
}
else
{
throw new ArgumentNullException("_emailLogger");
}
if (_databaseLogger != null)
{
_databaseLogger.Log(message);
}
else
{
throw new ArgumentNullException("_databaseLogger");
}
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And of course we need to have some registration in container in some BootStraper class :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public static class BootStraper
{
public static void SetUp()
{
IContainer container = UnityContainer.Instance();
container.RegisterType&amp;lt;IEmailProxy,EmailProxy&amp;gt;();
container.RegisterType&amp;lt;IDatabaseMechanism,DatabaseMechanism&amp;gt;();
container.RegisterType&amp;lt;ILogger,EmailLogger&amp;gt;("EmailLogger");
container.RegisterType&amp;lt;ILogger,DatabaseLogger&amp;gt;("DatabaseLogger");
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Consuming this class is simple :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class Consume
{
public void ConsumeLogger()
{
Bootstraper.SetUp();
ILogger logger=new Logger();
logger.Log("Some message");
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Code is simple and understandable and we don&amp;rsquo;t need to use any container to call this class . If someone reference your dll it can use your code without any container registration or resolve . You just call&amp;nbsp; method in that class and he not see container calls and deeper logic inside this Facade class.&lt;/p&gt;
&lt;p&gt;And finally test is very simple too :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;[TestClass]
public class LoggerTests
{
private readonly ILogger _emailLogger;
private readonly ILogger _databaseLogger;
private readonly IContainer _container;
public LoggerTests()
{
_container = UnityContainer.Instance();
_emailLogger = MockRepository.GenerateMock&amp;lt;ILogger&amp;gt;();
_databaseLogger = MockRepository.GenerateMock&amp;lt;ILogger&amp;gt;();
_container.RegisterInstance&amp;lt;ILogger&amp;gt;("EmailLogger", _emailLogger);
_container.RegisterInstance&amp;lt;ILogger&amp;gt;("DatabaseLogger", _databaseLogger);
}
[TestMethod]
public void Log_AcceptCorrectArgs_CallsEmailLoggerLog()
{
//arrange
ILogger logger = new Logger();
//act
logger.Log("Something");
ILogger emailLogger = _container.Resolve&amp;lt;ILogger&amp;gt;("EmailLogger");
//assert
emailLogger.AssertWasCalled(x =&amp;gt; x.Log("Something"));
}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We register instance of mock objects EmailLogger and DataBaseLogger in Container and resolve later in test to ensure that correct method of mock object is called.&lt;/p&gt;
&lt;p&gt;I hope this will help you in some of your projects.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/lEWkhMZHrH8" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2009/10/31/Unit-testing-Facade-pattern.aspx</link>
      <comments>http://blog.developers.ba/post/2009/10/31/Unit-testing-Facade-pattern.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=b48dd5f1-d666-4785-ac2a-7ff9fcd5097c</guid>
      <pubDate>Sat, 31 Oct 2009 13:02:00 -1000</pubDate>
      <category>IOC</category>
      <category>Patterns</category>
      <category>Testing</category>
      <category>Unit testing</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=b48dd5f1-d666-4785-ac2a-7ff9fcd5097c</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=b48dd5f1-d666-4785-ac2a-7ff9fcd5097c</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2009/10/31/Unit-testing-Facade-pattern.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=b48dd5f1-d666-4785-ac2a-7ff9fcd5097c</wfw:commentRss>
    </item>
    <item>
      <title>Silverlight 3 FireStarter LiveMeeting Event September 17th</title>
      <description>&lt;p&gt;&lt;img src="http://blog.developers.ba/image.axd?picture=2009%2f9%2fimage_thumb_2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;This summer&amp;rsquo;s biggest blockbuster technology event is coming to Redmond, WA on the 17&lt;sup&gt;th&lt;/sup&gt; of September.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Register to attend the Silverlight-3 FireStarter event on Thursday, the 17&lt;sup&gt;th&lt;/sup&gt; of September. We have a stellar speaker line up from the Microsoft roster. We will have Scott Guthrie keynote the event followed by presentations from Tim Heuer, Brad Abrams, Karl Shifflett and others...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;At this event we will focus on three areas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;What&amp;rsquo;s latest and greatest in with the latest release of Silverlight&lt;/p&gt;
&lt;p&gt;&amp;nbsp;What&amp;rsquo;s happening in the world of Expression 3, and&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Give you a run down on .NET RIA Services, Toolkit, etc.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style="width: 863px;" border="4" cellspacing="0" cellpadding="4"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;Time&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;Session&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;Speaker&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;8:45 &amp;ndash; 9:00 AM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Event Kick off&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://blogs.msdn.com/mithund"&gt;Mithun Dhar&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;9:00 &amp;ndash; 10:00 AM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Keynote&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott Guthrie&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;10:00 &amp;ndash; 11:00 AM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Key Silverlight Scenarios&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://timheuer.com/blog/"&gt;Tim Heuer&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;11:00 &amp;ndash; 11:15 AM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;em&gt;Break&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;11:15 AM &amp;ndash; 12:15 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Expression 3 Overview (Includes Behaviors)&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;Adam Kinney&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;12:15 &amp;ndash; 1:00 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;&lt;strong&gt;&lt;em&gt;Lunch Break&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;(Provided by Microsoft)&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;1:00 &amp;ndash; 1:30 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Sketch Flow&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://blogs.msdn.com/janete/default.aspx"&gt;Janete Perez&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;1:30 &amp;ndash; 2:30 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Toolkit &amp;amp; Controls&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://silverlight.net/blogs/JustinAngel/"&gt;Justin Angel&lt;/a&gt;/&lt;a href="http://blog.enginefour.com/"&gt;Shawn Oster&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;2:30 &amp;ndash; 3:30 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;RIA Services&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://blogs.msdn.com/brada/"&gt;Brad Abrams&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;3:30 &amp;ndash; 3:45 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Break&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;3:45 &amp;ndash; 4:30 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Building Silverlight UIs with XAML Power toys&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;&lt;a href="http://karlshifflett.wordpress.com/"&gt;Karl Shifflett&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="85"&gt;
&lt;p align="left"&gt;4:30 &amp;ndash; 5:00 PM&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="170"&gt;
&lt;p align="left"&gt;Q &amp;amp; A Panel&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="130"&gt;
&lt;p align="left"&gt;All Speakers&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Registrations:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In-Person (Redmond, WA) Event: &lt;a title="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032422412&amp;amp;Culture=en-US" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032422412&amp;amp;Culture=en-US"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032422412&amp;amp;Culture=en-US&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you can't join us for the In-person event, &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032423163&amp;amp;Culture=en-US"&gt;Register for the online experience!&lt;/a&gt; (Entire event will be broadcasted online via Live Meeting - Must Register!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;Source:&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;a href="http://blogs.msdn.com/mithund/archive/2009/08/12/silverlight-3-firestarter-thursday-september-17th-2009-attend-redmond-wa-or-online-must-register.aspx"&gt;http://blogs.msdn.com/mithund/archive/2009/08/12/silverlight-3-firestarter-thursday-september-17th-2009-attend-redmond-wa-or-online-must-register.aspx &lt;/a&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/RadenkoZecBlog/~4/UGg9YslwRJ4" height="1" width="1"/&gt;</description>
      <link>http://blog.developers.ba/post/2009/09/08/Silverlight-3-FireStarter-LiveMeeting-Event-September-17th.aspx</link>
      <comments>http://blog.developers.ba/post/2009/09/08/Silverlight-3-FireStarter-LiveMeeting-Event-September-17th.aspx#comment</comments>
      <guid>http://blog.developers.ba/post.aspx?id=2477f19e-231e-46e7-b15f-5529dd9de507</guid>
      <pubDate>Tue, 08 Sep 2009 03:16:00 -1000</pubDate>
      <category>Silverlight</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://blog.developers.ba/pingback.axd</pingback:server>
      <pingback:target>http://blog.developers.ba/post.aspx?id=2477f19e-231e-46e7-b15f-5529dd9de507</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.developers.ba/trackback.axd?id=2477f19e-231e-46e7-b15f-5529dd9de507</trackback:ping>
      <wfw:comment>http://blog.developers.ba/post/2009/09/08/Silverlight-3-FireStarter-LiveMeeting-Event-September-17th.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.developers.ba/syndication.axd?post=2477f19e-231e-46e7-b15f-5529dd9de507</wfw:commentRss>
    </item>
  </channel>
</rss>

