Как работает пример Ninject WCF Extensions TimeService? - PullRequest
3 голосов
/ 02 ноября 2010

У меня есть служба .Net 4.0 WCF, для которой я пытаюсь настроить ninject.Я скачал расширение WCF для ninject и посмотрел пример TimeService.Все выглядит достаточно просто, однако я не вижу, как ninject выполняет свою работу правильно, поскольку есть конструктор без параметров, вручную вводящий зависимость.

 public TimeService()
    : this(new SystemClock())
{
}

public TimeService( ISystemClock systemClock )
{
    _systemClock = systemClock;
}

Насколько я понимаю, этот код никогда не будет использоватьобязательная привязкаПервый конструктор вызовет второй конструктор, если я не предоставлю никаких параметров.Когда в тестировании я передаю свой фиктивный объект, будет вызван второй конструктор.Я довольно новичок как в WCF, так и в Nineject, поэтому извиняюсь, если я упускаю что-то очевидное!

1 Ответ

2 голосов
/ 02 ноября 2010

По умолчанию Ninject выберет конструктор с наибольшим количеством параметров, который имеет достаточную информацию для связывания. Поэтому, если модуль Ninject может обеспечить реализацию ISystemClock, Ninject предпочтет второй конструктор.

Шаблон, который вы здесь показываете, часто используется, когда вы хотите разрешить вводимые зависимости, но по-прежнему имеете логическое значение по умолчанию, чтобы использовать его в случае отсутствия конкретной зависимости. Как вы указали, при модульном тестировании вы можете предоставить свой собственный макет ISystemClock, который дает вам преимущество детерминированного тестирования. Аналогичным образом, если у вас была какая-то причина хотеть предоставить собственную реализацию ISystemClock, вы можете настроить модули Ninject с соответствующей привязкой.

С другой стороны, для большинства целей лучше всего использовать стандартную реализацию SystemClock, поэтому вместо того, чтобы заставлять вас устанавливать привязку ISystemClock, чтобы класс функционировал, предоставляется альтернативный конструктор, который использует SystemClock как реализация по умолчанию. Ninject обратится к этому конструктору, если вы не указали привязку для службы ISystemClock.

Редактировать

В данном конкретном случае причина, по которой он не работает, заключается в следующем атрибуте класса TimeService:

[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]

Я не до конца понимаю, что здесь происходит, но это как-то мешает использовать Ninject для создания сервиса. Если вы закомментируете эту строку, она должна работать как положено.

...