0

我正在开发一个广泛使用 Spring AOP 的应用程序。该应用程序是用 .NET 2.0 编写的,但我正在尝试将其升级到 .NET 4.0。这意味着从 Spring 1.2.0 升级到 1.3.2,然而,这似乎引起了一些问题。

这是我现在尝试访问默认页面时收到的错误。

Error thrown by a dependency of object 'IType1' defined in 'file [C:\svn\Application.Web\Configs\ImmutableDefinitions.xml] line 55' : Unsatisfied dependency expressed through constructor argument with index 0 of type [Application.Logic.Process.OrderBlo] : Error thrown by a dependency of object 'OrderBlo' defined in 'file [C:\svn\Application.Web\Configs\Order_Logic.xml] line 10' : Initialization of object failed : Cannot instantiate Type [Application.Interceptors.ActivityMonitorInterceptor] using ctor [Void .ctor(Application.Logic.ActivityMonitorBlo)] : 'Unable to cast object of type 'CompositionAopProxy_fe703921758d417f8e6a2d4a6b9ff525' to type 'Application.Logic.ActivityMonitorBlo'.'while resolving 'organisationBlo' to 'OrganisationBlo' defined in 'file ... Followed by cascading type initializers...

现在要明确一点,这在带有 Spring 1.2.0 的 .NET 2.0 中运行良好。所以问题是,在 1.2.0 和 1.3.2 之间发生了什么变化会导致这个错误?或者,有人可以进一步解释这个错误,以及 aop 是如何导致这个错误的?

除了 Spring.Core、Spring.Aop 和所有其他 Spring.* 参考之外,我没有升级解决方案中的任何其他库。

4

1 回答 1

1

我不确定 1.2.0 和 1.3.2 之间的更改历史记录,但错误消息告诉我您正在尝试Application.Logic.ActivityMonitorBlo使用建议的依赖项设置注入属性或构造函数参数。

当您为目标对象定义通知时,spring.net 默认创建一个基于组合的代理,代理它在目标类上找到的所有接口。如果它没有找到任何接口,那么它会创建一个继承目标类的代理类,并为目标类上的所有虚拟方法创建代理方法,请参阅 spring 文档关于代理机制

我曾多次收到此错误消息,例如当我将接口添加到以前没有任何接口的类时。突然间,aop 代理不再属于目标类型的类,而是基于组合的代理,只实现了添加的接口,导致同样的错误。

(请注意,通常最好依赖接口而不是具体类。)

在 1.1.0 和 1.3.2 之间确实发生了变化的是添加了基于继承的 aop 配置器,但我不确定这与您的问题有何关系。

于 2013-10-16T07:12:00.937 回答