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

<channel>
	<title>Agile at Work &#187; Validation</title>
	<atom:link href="http://www.agileatwork.com/tag/validation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agileatwork.com</link>
	<description>by Michael Valenty</description>
	<lastBuildDate>Sat, 10 Sep 2011 14:35:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Validation with Unity Interception</title>
		<link>http://www.agileatwork.com/validation-with-unity-interception/</link>
		<comments>http://www.agileatwork.com/validation-with-unity-interception/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 20:16:19 +0000</pubDate>
		<dc:creator>Michael Valenty</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Composite Pattern]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://www.agileatwork.com/?p=149</guid>
		<description><![CDATA[ 
This is how I want things to look: 
public class UpdateUserRequest
{
    [AuthorizedUserPublisherRequired]
    public int UserId { get; set; }

    [Required(&#34;Name is required&#34;)]
    public string Name { get; set; }

    [ValidZipCodeRequired(&#34;Invalid zip code&#34;)]
    public string ZipCode { [...]]]></description>
			<content:encoded><![CDATA[<p><img title="funny_sign_5" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="237" alt="funny_sign_5" src="http://www.agileatwork.com/wp-content/uploads/2009/07/funny_sign_5.jpg" width="240" border="0" /> </p>
<p>This is how I want things to look: </p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> UpdateUserRequest
{
    [AuthorizedUserPublisherRequired]
    <span class="kwrd">public</span> <span class="kwrd">int</span> UserId { get; set; }

    [Required(<span class="str">&quot;Name is required&quot;</span>)]
    <span class="kwrd">public</span> <span class="kwrd">string</span> Name { get; set; }

    [ValidZipCodeRequired(<span class="str">&quot;Invalid zip code&quot;</span>)]
    <span class="kwrd">public</span> <span class="kwrd">string</span> ZipCode { get; set; }
}</pre>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> IUserService
{
    <span class="kwrd">void</span> Update(UpdateUserRequest request);
} </pre>
<p>There are validation frameworks out there that will do this, so what’s my beef? Well, first of all I want to inject the validators with dependencies to implement the juicier rules. And second, I’m treating validation as a core concern so I don’t want a dependency on a framework like Enterprise Library. I had several questions like:</p>
<p>1) How do I get dependencies into the validators?</p>
<p>2) How do I get <font face="Courier New" size="2">ValidZipCodeRequired</font> to fire with the value of the <font face="Courier New" size="2">ZipCode</font> property</p>
<p>3) How do I initiate this on <font face="Courier New" size="2">userService.Update()</font>?</p>
<p>Let’s take a look at building up the validators.</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ValidZipCodeRequiredAttribute : ValidatorAttribute
{
    <span class="kwrd">public</span> <span class="kwrd">override</span> IValidator CreateValidator(IValidatorFactory factory)
    {
        <span class="kwrd">return</span> <span class="kwrd">new</span> factory.Create&lt;ValidZipCodeRequiredValidator&gt;();
    }
}</pre>
<p>This allows me to make a <font face="Courier New" size="2">UnityValidatorFactory</font> that can supply all my dependencies. Now how about this business of running the <font face="Courier New" size="2">ValidZipCodeRequiredValidator</font> with the value of the <font face="Courier New" size="2">ZipCode</font> property? For that I made a composite validator that loops through each property and runs the annotated validator against it’s property value.</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> CompositeValidator&lt;T&gt; : IValidator&lt;T&gt;
{
    <span class="kwrd">private</span> IValidatorFactory factory;

    <span class="kwrd">public</span> CompositeValidator(IValidatorFactory factory)
    {
        <span class="kwrd">this</span>.factory = factory;
    }

    <span class="kwrd">public</span> IEnumerable&lt;RuleException&gt; Validate(T subject)
    {
        List&lt;RuleException&gt; exceptions = <span class="kwrd">new</span> List&lt;RuleException&gt;();

        <span class="kwrd">foreach</span> (PropertyInfo property <span class="kwrd">in</span> <span class="kwrd">typeof</span>(T).GetProperties())
        {
            <span class="kwrd">foreach</span> (var validator <span class="kwrd">in</span> GetValidatorsFor(property))
            {
                exceptions.AddRange(validator.Validate(property.GetValue(subject, <span class="kwrd">null</span>)));
            }
        }

        <span class="kwrd">return</span> exceptions;
    }

    <span class="kwrd">private</span> IEnumerable&lt;IValidator&gt; GetValidatorsFor(ICustomAttributeProvider provider)
    {
        <span class="kwrd">foreach</span> (ValidatorAttribute attribute
            <span class="kwrd">in</span> provider.GetCustomAttributes(<span class="kwrd">typeof</span>(ValidatorAttribute), <span class="kwrd">true</span>))
        {
            <span class="kwrd">yield</span> <span class="kwrd">return</span> attribute.CreateValidator(factory);
        }
    }
}</pre>
<p>Now I just need to run the <font face="Courier New" size="2">CompositeValidator</font> on <font face="Courier New" size="2">userService.Update()</font>. For that I use Unity Interception:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ValidationCallHandler : ICallHandler
{
    <span class="kwrd">private</span> IValidator validator;

    <span class="kwrd">public</span> ValidationCallHandler(IValidator validator)
    {
        <span class="kwrd">this</span>.validator = validator;
    }

    <span class="kwrd">public</span> IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        var ruleExceptions = ValidateEachArgument(input.Arguments);

        <span class="kwrd">if</span> (ruleExceptions.Count() &gt; 0)
        {
            <span class="kwrd">throw</span> <span class="kwrd">new</span> ValidationException(ruleExceptions);
        }

        <span class="kwrd">return</span> getNext()(input, getNext);
    }

    <span class="kwrd">private</span> IEnumerable&lt;RuleException&gt; ValidateEachArgument(IParameterCollection arguments)
    {
        var ruleExceptions = <span class="kwrd">new</span> List&lt;RuleException&gt;();

        <span class="kwrd">foreach</span> (var arg <span class="kwrd">in</span> arguments)
        {
            ruleExceptions.AddRange(validator.Validate(arg));
        }

        <span class="kwrd">return</span> ruleExceptions;
    }

    <span class="kwrd">public</span> <span class="kwrd">int</span> Order { get; set; }
}</pre>
<p>Phew, we’re almost done. The only thing left is to apply this validator in configuration so I can keep the Unity reference out of my core domain. That looks like this:</p>
<pre class="csharpcode">container.AddNewExtension&lt;Interception&gt;()
    .Configure&lt;Interception&gt;()
    .SetInterceptorFor&lt;IUserService&gt;(<span class="kwrd">new</span> InterfaceInterceptor())
    .AddPolicy(<span class="str">&quot;UserServiceValidationPolicy&quot;</span>)
    .AddCallHandler&lt;ValidationCallHandler&gt;()
    .AddMatchingRule&lt;AlwaysApplyMatchingRule&gt;();</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.agileatwork.com/validation-with-unity-interception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

