0

Ninject 2.2を使用して、次の失敗したテストがあります(簡略化):

public interface IGenericView<T>
{
}

public interface IDefaultConvention
{
}

public class DefaultConvention : IDefaultConvention
{
}

public class DefaultConventionView : IGenericView<IDefaultConvention>
{ 
}

public class StringView : IGenericView<string>
{  
}

[TestFixture]
public class NinjectTests
{
    private static IKernel _kernel;

    [SetUp]
    public void Setup()
    {
        _kernel = new StandardKernel();
    }

    [Test]
    public void CanResolveAllClassesClosingOpenGenericInterface()
    {
        // Arrange
        _kernel.Bind<IDefaultConvention>().To<DefaultConvention>();
        _kernel.Scan(
            x =>
            {
                x.FromCallingAssembly();
                x.BindWith(new GenericBindingGenerator(typeof(IGenericView<>)));
            });

        // Act
        object target1 = _kernel.Get<IGenericView<IDefaultConvention>>();
        object target2 = _kernel.Get<IGenericView<string>>();

        // Assert
        Assert.IsAssignableFrom<DefaultConventionView>(target1);
        Assert.IsAssignableFrom<StringView>(target2);
        Assert.AreEqual(2, _kernel.GetAll(typeof(IGenericView<>)).Count()); // Always returns 0
    }
}

最初の 2 つのアサーションはパスしたので、型自体が正しくバインドされていることはわかっていますが、オープン ジェネリック インターフェイスのバインドをすべて取得することはできません。これはまったく可能ですか?

4

1 に答える 1

4

いいえ、それは不可能です。Ninject は、どの型がジェネリック パラメーターとして許可されているかをどこで知る必要がありますか? なぜ 2 が正しい値だと思いますか? なぜIGenericView<int>あまりにも返されるべきではないのですか?さらに、戻り値の型は何ですか?IEnumerable<IGenericView<>>は許可されたランタイム タイプではありません。IEnumerable<IGenericView<object>>おそらく期待するものではありません。

GetAll は、要求された型のバインディングごとに 1 つのインスタンスを返します。この場合は 1 つだけです。この場合、共通の非ジェネリック ベース インターフェイスを定義し、それを型ごとに登録して、このインターフェイスに対して GetAll を呼び出す必要があります。

于 2011-11-11T23:38:31.533 に答える