我正在尝试在.net MVC 4应用程序中使用castle的动态代理库实现AOP日志记录。我们正在使用结构图来进行依赖注入。
我已成功为我们的标准普通MVC控制器设置AOP日志记录,但我们还有一个文件夹,其中包含我们也使用的WebAPI控制器。
我遇到的问题是,对于任何WEBApi调用,我都会收到以下错误
"Unable to cast object of type 'Castle.Proxies.IHttpControllerProxy' to type 'Web.Controllers.Services.Home.apiContollerName'.","ExceptionType":"System.InvalidCastException"
以下是我的拦截器设置的详细设置
//Logging Interceptor in strucutremap ObjectFactory.Initialize
x.RegisterInterceptor(new LogTypeInterceptor());
这是我的处理方法
public object Process(object target, IContext context)
{
var obj = new object();
obj = _proxyGenerator.CreateInterfaceProxyWithTargetInterface(
target.GetType().GetInterfaces().First(),
target.GetType().GetInterfaces(),
target, new LoggingInterceptor());
return obj;
}
我怀疑我需要在_proxyGenerator上调用一个不同的方法,但我是新手,不知道我应该调用哪种方法。
答案 0 :(得分:1)
问题似乎是你的代理类只模仿接口而不是基类,所以当内部WebAPI代码试图将代理转换为控制器类时,代码就会失效。如果您通过拨打
来取代对CreateInterfaceProxyWithTargetInterface
的通话
_proxyGenerator.CreateClassProxyWithTarget(target.GetType(),
target,
new LoggingInterceptor());
然后这个问题就会消失,但是会引入一个新的问题:对于没有无参数构造函数的任何类,代理创建将失败,并且错误消息“没有为此对象定义无参数构造函数”。因此,您可能必须向所有类添加无参数构造函数。如果你可以转而使用Castle Windsor作为你的IoC,那么you can use the interceptors and IoC as a one-stop shop。