This post continues on from the previous post. Part 4 Enterprise Library 6, Unity 3 InterfaceInterceptor with MVC 4
In this post a validation call handler will be added using unity 3 with VirtualMethodInterceptor and enteprise library Policy Injection. Enterprise library 6 has the following call handlers (Out of the box):
- AuthorizationCallHandler
- ExceptionCallHandler
- LogCallHandler
- PerformanceCounterCallHandler
- ValidationCallHandler
Using the ValidationCallHandler attribute, any method can be extended with a declaration decorator. In a first step a enterprise library validation ruleset will be defined directly in the method.
To start add the nuget pacakges:
Both the EL6 Validation block and the EL6 Policy Injection blocks are required.
Now a new DiagnosisCallHandler is required
using System; using Microsoft.Practices.Unity.InterceptionExtension; using MvcUnityBootstrapperTest.Logging; namespace MvcUnityBootstrapperTest.UnityExtensions { public class DiagnosisCallHandler : ICallHandler { public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { DiagnosisEvents.Log.MethodEnter(String.Format("[{0}:{1}]", this.GetType().Name, "Invoke")); // BEFORE the target method execution DiagnosisEvents.Log.LogVerboseMessage(String.Format("{0} {1}", input.MethodBase.ToString(), input.Target.ToString())); // Yield to the next module in the pipeline var methodReturn = getNext().Invoke(input, getNext); // AFTER the target method execution if (methodReturn.Exception == null) { DiagnosisEvents.Log.MethodLeave(String.Format("Successfully finished {0} {1}", input.MethodBase.ToString(), input.Target.ToString())); } else { DiagnosisEvents.Log.MethodLeave(String.Format("Finished {0} with exception {1}: {2}", input.MethodBase.ToString(), methodReturn.Exception.GetType().Name, methodReturn.Exception.Message)); } return methodReturn; } public int Order { get; set; } } }
And also a attribute
using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; namespace MvcUnityBootstrapperTest.UnityExtensions { public class DiagnosisHandlerAttribute : HandlerAttribute { public override ICallHandler CreateHandler(IUnityContainer container) { return new DiagnosisCallHandler(); } } }
Now a method ist required to be injected. NOTE: The virtual is required because VirtualMethodInterceptor is used for the injection. The ruleset is direct in the method.
using Microsoft.Practices.EnterpriseLibrary.Validation.PolicyInjection; using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; [ValidationCallHandler()] [DiagnosisHandlerAttribute()] public virtual void Deposit( [RangeValidator(typeof(Decimal), "1.0", RangeBoundaryType.Exclusive, "2.0", RangeBoundaryType.Exclusive)] decimal depositAmount) { string x = ""; }
Now the unity configuration method is extended.
container.Configure<Interception>().SetInterceptorFor<UnitOfWorkExample>( new VirtualMethodInterceptor());
code: https://github.com/damienbod/MvcUnityValidationHandlerInterception.git
The deposit method is executed as follows:
As you see it is relatively simple to add validation using unity 3 interception.
Part 1 Enterprise Library 6, Unity 3 with ASP.NET MVC 4
Part 2 Enterprise Library 6, Unity 3 and MVC 4, LifetimeManagers
Part 3 Enterprise Library 6, Unity 3 and MVC 4, Registration by Convention
Part 4 Enterprise Library 6, Unity 3 InterfaceInterceptor with MVC 4
Links