代码之家  ›  专栏  ›  技术社区  ›  Paul Hadfield

温莎城堡2.5

  •  1
  • Paul Hadfield  · 技术社区  · 14 年前

    我刚刚下载了动态对象框架 clay 并且正在遇到与之相关的问题 castle project versions。Clay使用“Castle”2.0版的功能,而我有一个项目已经开始引用2.5版。不用说为了让事情更有趣,我完全是“城堡”和国际奥委会的初学者。

    真正的问题是,升级粘土解决方案中的引用会导致折旧方法警告。无论您是否支持该方法,提供的单元测试都会失败,在“InterfaceProxyBehavior”的“Intercept”中的以下代码中出现“cannot perform runtime binding on a null reference”异常:

    var invoker=bindinvoker(invocation);
    调用程序(调用);
    < /代码> 
    
    

    生成运行时警告的代码位于“DefaultClayActivator”的“CreateInstance”中:

    //var proxytype=_builder.createClassProxy(baseType,options);
    var proxytype=_builder.createClassProxyType(baseType,空,选项);
    < /代码> 
    
    

    如前所述,我仍然是温莎城堡的一个完全初学者,刚从国际奥委会开始,所以还没有遇到代理的问题。令人沮丧的是,我甚至不知道错误消息是在告诉我什么,还是在要求什么。

    是否有人已经将粘土移植到城堡项目的2.5版,所以要知道所需的步骤。或者任何一个有城堡这一部分经验的人都能对这个错误和我可能需要做的来解决它投下更多的光吗?

    更新

    对于失败的功能,我仍然不太明智,但我有机会重新访问在castle.core中运行v2.0(works)和v2.5(breaks)的代码。附件是调试信息工作时和中断时的两个图像。它失败的测试在下面,我用注释指示了呼叫。

    命名空间claysharp.tests{
    [测试夹具]
    公共类BinderFallbackTests{
    …
    [试验]
    public void testinvokepaths()。{
    var dynamically=clayActivator.createInstance<alpha>(新的IClayBehavior[]){
    新建InterfaceProxyBehavior(),
    新Alphabehavior()
    (});
    alpha静态=动态;
    ialpha interfacely=动态;
    
    assert.that(dynamically.hello(),is.equalto(“world-”);
    assert.that(statically.hello(),is.equalto(“world-”);
    assert.that(interfacely.hello(),is.equalto(“world-”));//<-在此调用上失败
    
    assert.that(dynamically.foo(),is.equalto(“bar-”);
    assert.that(interfacely.foo(),is.equalto(“bar-”);
    
    assert.throws<runtimebinderexception>(()=>动态。MissingNotHandled());
    }
    …
    }
    }
    < /代码> 
    
    

    这是使用castle.core的v2.5时的调试信息,并引发异常:

    这是使用castle.core的v2.0(可以工作)对同一个调用/线路的调试信息,该调用/线路导致了v2.5的问题。 .我遇到了一些问题castle project版本。Clay使用“Castle”2.0版的功能,而我有一个项目已经开始引用2.5版。不用说只是为了让事情更有趣,我是一个完全的初学者在所有的事情“城堡”和国际奥委会。

    真正的问题是,升级粘土解决方案中的引用会导致折旧方法警告。无论您是否支持该方法,提供的单元测试都会失败,在“InterfaceProxyBehavior”的“Intercept”中的以下代码中出现“cannot perform runtime binding on a null reference”异常:

           var invoker = BindInvoker(invocation);
           invoker(invocation);
    

    生成运行时警告的代码位于“DefaultClayActivator”的“CreateInstance”中:

           //var proxyType = _builder.CreateClassProxy(baseType, options);
           var proxyType = _builder.CreateClassProxyType(baseType, null, options);
    

    如前所述,我仍然是温莎城堡的一个完全初学者,刚从国际奥委会开始,所以还没有遇到代理的问题。令人沮丧的是,我甚至不知道错误信息告诉我什么,或者要求什么。

    是否有人已经将粘土移植到城堡项目的2.5版,所以要知道所需的步骤。或者任何一个有城堡这一部分经验的人都能对这个错误和我可能需要做什么来解决它提供更多的信息吗?

    更新的

    对于失败的功能,我仍然不太明智,但我有机会重新访问在castle.core中运行v2.0(works)和v2.5(breaks)的代码。附件是调试信息工作时和中断时的两个图像。它失败的测试在下面,我用一个注释来表示这个调用。

    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时的调试信息,并引发异常: alt text

    这是使用castle.core的v2.0(可以工作)对同一个调用/线路的调试信息,该调用/线路导致了v2.5的问题。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Krzysztof Kozmic    14 年前

    我从来没有用过粘土,所以下面的所有东西都是基于假设。

    错误消息来自 BindInvoker 这不是Castle错误,但我猜这是因为调用程序试图绑定到代理的调用目标,在某些情况下,在dynamicProxy2.1中,该目标曾经有值,这是错误的,而2.2和2.5版的更高版本修复了这一问题,但这是您现在正在经历的一个破坏性的更改。

    另一条错误消息告诉您

    使用CreateClassProxyType方法 相反。

    这是您注释掉的另一种方法。这里不明显的是什么?

        2
  •  3
  •   Remco Ros    14 年前

    我好像把这个修好了。(所有测试通过)

    查看我创建的codeplex的工作项和我推到fork上的更改: http://clay.codeplex.com/SourceControl/network/Forks/remcoros/Clay

        3
  •  0
  •   bmustata    14 年前

    关于粘土动态对象的一些不错的教程:

    • 延展性C动态物体第1部分 Link

    • 延展性C动态物体第2部分 Link .