Ninject является специфическим для порядка кода конструкторов - PullRequest
3 голосов
/ 18 июля 2011

Обновление

Мне удалось обойти это.Теперь я проверяю, можно ли разрешить зависимость.Если нет, я поищу конструктор без параметров (через Reflection) и назову его.Но я думаю, что это часть работы Ninjects ... так что все же это скорее обходной путь, чем реальное решение.

Оригинальный вопрос

public class Test
{
    public Test(INavigationService asd)
    {
        // rnd stuff
    }

    public Test()
    {
        // other rnd stuff
    }
}

У меня естьэтот тестовый класс.Теперь я хочу два экземпляра, созданных Ninject.Поэтому я делаю следующее:

Test test = Kernel.Get<Test>();

и запускаю исключение: «Ninject.ActivationException: Ошибка при активации INavigationService».

Если я переупорядочиваю конструкторы следующим образом

public class Test
{
    public Test()
    {
        // other rnd stuff
    }

    public Test(INavigationService asd)
    {
        // rnd stuff
    }
}

это работает.Но я не могу быть уверен, что каждый класс, который я использую с Ninject, имеет свои конструкторы в «правильном» порядке.Итак, есть ли способ сказать Ninject, что он не должен игнорировать конструктор без параметров, если он не первый?

Заранее спасибо.

1 Ответ

6 голосов
/ 18 июля 2011

Ninject пытается ввести тот, у которого больше всего параметров (что он знает, как решить *). Тем не менее, вы можете явно указать Ninject, какой constructor ввести:

public class Test
{

    public Test(INavigationService asd)
    {
        // rnd stuff
    }

    [Inject]
    public Test()
    {
        // other rnd stuff
    }
}

Примечание: Нельзя присвоить атрибут Inject более чем одному конструктору. Это вызовет исключение.

Обновление: Вот еще один способ решения этой проблемы, стоит попробовать.

Bind<ITest>().ToMethod(x => factoryMethod()); factoryMethod делает две вещи:

  1. Проверяет, загружена ли ваша зависимость через Kernel.CanResolve() или другим способом.
  2. Если да, то использовать параметризованный ctor. Если нет, используйте конструктор без параметров.

Чувствует себя липким и не уверен, что это хороший шаблон для подражания. Если параметры являются необязательными, лучше всего использовать внедрение свойства (обычно хмурится) или внедрение метода.

...