1

Castle Windsor IoC コンテナーを使用するコード ベースを継承しました。最近、別の互換性の問題により、バージョン v2.5.2 を 3.0.0 からアップグレードすることを余儀なくされました。

v3.0.0 へのアップグレード後、テスト クラスの 1 つである次の拡張メソッドは、次のエラーでビルドに失敗します。

型 '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 はインターフェイスを使用できなくなったように見えますか? ドキュメントを見ても、修正方法がわかりません。

任意のポインタをいただければ幸いです。

4

1 に答える 1

1

where TInterface : classメソッドに制約を追加してみてください。

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

ComponentRegistration3.0 で一般的な制約が変更されたようです。

于 2012-07-07T12:38:00.020 に答える