升级到v3.0.0后,Castle ComponentRegistration错误

时间:2012-07-07 12:26:15

标签: c# generics castle

我继承了一个使用Castle Windsor IoC容器的代码库,我们最近被迫从3.0.0升级版本v2.5.2,因为另一个兼容性问题。

升级到v3.0.0之后,我们的一个测试类中的以下扩展方法无法构建,并出现以下错误:

类型'TInterface'必须是引用类型才能在泛型类型或方法'Castle.MicroKernel.Registration.ComponentRegistration'

中将其用作参数'TService'
public static class ContainerExtensions
{
    /// <summary>
    /// Sets the registration expectation on the mocked container.
    /// </summary>
    /// <typeparam name="TInterface">The type of the interface.</typeparam>
    /// <typeparam name="TImplementation">The type of the implementation.</typeparam>
    /// <param name="container">The container.</param>
    public static void SetRegistrationExpectation<TInterface, TImplementation>(this IWindsorContainer container) where TImplementation : TInterface
    {
        Predicate<IEnumerable<IRegistration>> pred = regs =>
        {
            var reg = regs.OfType<ComponentRegistration<TInterface>>().FirstOrDefault();
            return reg != null && reg.Implementation == typeof(TImplementation);
        };

        container
            .Expect(c => c.Register(null))
            .IgnoreArguments()
            .Constraints(Rhino.Mocks.Constraints.Is.Matching(pred))
            .Repeat.Once();
    }
}

所以看起来ComponentRegistration不能再使用接口了吗?看过文档后,我仍然不确定如何纠正?

任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

尝试向您的方法添加where TInterface : class约束:

public static void SetRegistrationExpectation<TInterface, TImplementation>(this IWindsorContainer container)
    where TInterface : class
    where TImplementation : TInterface

似乎ComponentRegistration通用约束在3.0中发生了变化。