我继承了一个使用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不能再使用接口了吗?看过文档后,我仍然不确定如何纠正?
任何指针都会受到赞赏。
答案 0 :(得分:1)
尝试向您的方法添加where TInterface : class
约束:
public static void SetRegistrationExpectation<TInterface, TImplementation>(this IWindsorContainer container)
where TInterface : class
where TImplementation : TInterface
似乎ComponentRegistration
通用约束在3.0中发生了变化。