Windsor的问题在添加拦截器后调用“通用化”方法

时间:2009-08-09 03:14:00

标签: generics castle-windsor iinterceptor

我有一个使用Windsor for IoC的应用程序运行良好。我想记录对Windsor实例化的组件所做的所有调用的方法调用,参数和执行时间,所以我实现了一个实现IInterceptor的LoggingInterceptor,它包含:

Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
invocation.Proceed();  // EXCEPTION IS THROWN HERE
sw.Stop();
Logger.Debug(.....

现在以前工作正常的操作会抛出VerificationExceptions,并带有以下消息:

Method Repositories.RepositoryBase.GetAll:type参数'ET'违反了类型参数'ET'的约束。

该方法的签名是:

public IList<ET> GetAll<ET>() where ET : EntityBase2, IEntity2  

(其中EntityBase2和IEntity2来自LLBLGenPro)

该方法的调用者如下:

public IList<ServerEntity> GetServers()
{
   return GetRepository<IServerRepository>().GetAll<ServerEntity>();
}

(其中GetRepository&lt;&gt;()只是ServiceLocator的包装器)

如果我从城堡配置中注释出拦截器,那么它一切正常。

为什么现在发生这种情况,是否有修复,以便我可以使用我的日志拦截器?

感谢

2 个答案:

答案 0 :(得分:1)

如果您使用的是较旧版本的Windsor(RC3或更早版本),我认为它不支持Generic类型的拦截器,因为旧的DynamicProxy不支持它。

您可以尝试更新到最新版本的Windsor。它使用DynamicProxy2,它使用泛型类型。

答案 1 :(得分:1)

这是否仅在Visual Studio调试器下发生?

这是否也发生在Castle的最新主干版本上? (你可以找到here