I am trying to use Interception
in a MVC
application. The problem I am having is with the controllers. Because the controllers are registered in the Unity
container, and don't have interfaces, I am getting an error. I think I need a way to exclude the controllers from the Interception
process or can I do something else? Is this possible or feasible? I asked a similar question on SO and, based on the comments I received, feel it's best to create another question.
Here's the error:
Exception information: Exception type: ResolutionFailedException Exception message: Resolution of the dependency failed, type = "CSR.Presentation.Controllers.HomeController", name = "(none)". Exception occurred while: Calling constructor Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior(Microsoft.Practices.Unity.InterceptionExtension.CurrentInterceptionRequest interceptionRequest, Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy[] policies, Microsoft.Practices.Unity.IUnityContainer container). Exception is: ArgumentException - Type passed must be an interface.
Here's the code;
// FIRST
container.RegisterTypes(
AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled,
t => new InjectionMember[] {
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<PolicyInjectionBehavior>()});
// SECOND
container.AddNewExtension<Interception>();
// THIRD
var first = new InjectionProperty("Order", 1);
var second = new InjectionProperty("Order", 2);
container.Configure<Interception>()
.AddPolicy("logging")
.AddMatchingRule<NamespaceMatchingRule>(
new InjectionConstructor(
new InjectionParameter("CSR.*")))
.AddCallHandler<LoggingCallHandler>(
new ContainerControlledLifetimeManager(),
new InjectionConstructor(),
first);
// Controller ==> execution doesn't reach here using interception
public class HomeController : Controller
{
public ActionResult Index()
{
return View("Index");
}
}