Как получить все привязки для универсального интерфейса, используя Ninject - PullRequest
0 голосов
/ 11 ноября 2011

Используя 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
    }
}

Первые два утверждения пройдены, так что я знаю, что сами типы связаны правильно, но я не могу получить все привязки для открытого универсального интерфейса, как я хочу. Это вообще возможно?

1 Ответ

4 голосов
/ 12 ноября 2011

Нет, это невозможно. Откуда Ninject должен знать, какие типы разрешены в качестве общих параметров? Исходя из вашего предположения, почему вы думаете, 2 является правильным значением? Почему бы IGenericView<int> тоже не вернуть? Кроме того, какой должен быть тип возвращаемого значения? IEnumerable<IGenericView<>> недопустимый тип времени выполнения. IEnumerable<IGenericView<object>>, вероятно, не то, что ожидают.

GetAll возвращает один экземпляр для каждой привязки запрошенного типа, и в этом случае есть только один. В этом случае вы должны определить общий неуниверсальный базовый интерфейс, зарегистрировать его для каждого типа и вызвать GetAll для этого интерфейса.

...