使用StructureMap.DynamicInterception进行面向方面编程

时间:2017-11-03 21:47:03

标签: c# asp.net-mvc aop structuremap

我实现了一个在结构图上使用DynamicInterception的控制台应用程序,我按照页面StructureMap DynamicInterception上的示例进行操作。 现在我试图将代码传递给asp.net MVC网站,但是我收到以下错误

装饰器拦截器在对象构造期间失败。查看内部异常:

  

1。)ITSector.Site.Core.Controllers.HomeController的DynamicProxyInterceptor,具有拦截功能   行为:ITSector.Library.Aspect.LoggerInterceptor   2.)ITSector.Site.Core.Controllers.HomeController   3.)ITSector.Site.Core.Controllers.HomeController的实例   4.)Container.GetInstance(ITSector.Site.Core.Controllers.HomeController)

内在的例外是: 指定的类型不是接口 参数名称:interfaceToProxy 使用stacktrace:

at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, Object target, ProxyGenerationOptions options, IInterceptor[] interceptors)
   at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget[TInterface](TInterface target, IInterceptor[] interceptors)
   at lambda_method(Closure , IBuildSession , IContext )

我使用Structure.MVC5.Update nuget作为依赖性解析器。 任何人都可以给我任何关于如何实现它来拦截控制器方法调用的提示。

感谢。

1 个答案:

答案 0 :(得分:0)

StructureMap期待For<T>()方法中的接口,但是你要传递它HomeController,这是一个具体的类。

你有几个选择让它运作起来。您可以使用LoggerInteceptorFor<IController>()附加到所有控制器。如果您只想将记录器连接到某些控制器,则可以专门为记录的控制器创建一个新接口,如For<ILoggedController>(),并确保所需的控制器继承ILoggedController。