我刚刚下载了动态对象框架Clay,并且遇到了有关castle project版本的问题。 Clay使用了“castle”v2.0中的功能,而我有一个已经开始引用v2.5的项目。毋庸置疑,只是为了让事情变得更有趣,我就是“城堡”和IoC的完全初学者。
真正的问题是,在粘土解决方案中升级参考会导致折旧的方法警告。无论您是否使用该方法,提供的单元测试都会失败,并在“InterfaceProxyBehavior”的“拦截”中的以下代码中“无法对空引用执行运行时绑定”异常:
var invoker = BindInvoker(invocation);
invoker(invocation);
产生运行时警告的代码位于“DefaultClayActivator”的“CreateInstance”中:
//var proxyType = _builder.CreateClassProxy(baseType, options);
var proxyType = _builder.CreateClassProxyType(baseType, null, options);
如前所述,我仍然是Castle Windsor的初学者,刚刚开始使用IoC,所以甚至还没有遇到过Proxy的东西。令人沮丧的是,我不知道错误信息是什么,甚至告诉我,或要求。
有没有人已经将Clay移植到城堡项目的2.5版本,所以知道所需的步骤。或者,任何有城堡这一部分经验的人都可以更多地了解错误以及我可能需要做些什么来解决它。
更新
对于失败的功能,我仍然没有那么明智,但是有机会在castle.core中使用v2.0(works)和v2.5(break)重新访问运行它的代码。附件是调试信息的两个图像,当它工作时,然后在它中断时。它失败的测试如下,我已经用评论表示了这个电话。
namespace ClaySharp.Tests {
[TestFixture]
public class BinderFallbackTests {
...
[Test]
public void TestInvokePaths() {
var dynamically = ClayActivator.CreateInstance<Alpha>(new IClayBehavior[] {
new InterfaceProxyBehavior(),
new AlphaBehavior()
});
Alpha statically = dynamically;
IAlpha interfacially = dynamically;
Assert.That(dynamically.Hello(), Is.EqualTo("World-"));
Assert.That(statically.Hello(), Is.EqualTo("World-"));
Assert.That(interfacially.Hello(), Is.EqualTo("World-")); // <- Fails on this call
Assert.That(dynamically.Foo(), Is.EqualTo("Bar-"));
Assert.That(interfacially.Foo(), Is.EqualTo("Bar-"));
Assert.Throws<RuntimeBinderException>(() => dynamically.MissingNotHandled());
}
...
}
}
这是使用castle.core的v2.5时的调试信息,并抛出异常:
这是使用castle.core v2.0的调试信息(对于导致v2.5问题的同一个调用/行)
答案 0 :(得分:3)
好像我修好了。 (所有测试通过)
查看我创建的codeplex上的工作项以及我推送到fork的更改: http://clay.codeplex.com/SourceControl/network/Forks/remcoros/Clay
答案 1 :(得分:1)
我从未使用过Clay这个东西,所以下面的所有内容都基于假设。
来自BindInvoker
的错误消息不是Castle错误,但我猜它正在发生,因为调用者试图绑定到代理的调用目标,在某些情况下,DynamicProxy 2.1中的调用目标有一个值,这是错误的,后来的版本2.2和2.5修复了这一点,但这是你正在经历的一个重大改变。
另一条错误消息告诉你
使用CreateClassProxyType方法 代替。
您注释掉了另一种方法。这里有什么不明显的?
答案 2 :(得分:0)