То, как вы это делаете, прекрасно на 100%;более «изящный» способ сделать это - использовать именованные привязки или метаданные.
Кстати, гораздо лучше не использовать в этом конструкторе singletonInstance
ServiceHost
случай, потому что если вы инициализируете его таким образом, то WCF не позволит вам использовать любой другой режим создания экземпляров (например, PerCall
).Пусть Ninject и WCF обрабатывают создание экземпляров и используют вместо этого конструктор на основе типов.
Именованный пример привязки будет следующим:
class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<ServiceHost>().To<NinjectServiceHost>().Named("POS")
.WithConstructorArgument("serviceType", typeof(PosService))
.WithConstructorArgument("baseAddresses", new Uri[0]);
Bind<ServiceHost>().To<NinjectServiceHost>().Named("ActivitySink")
.WithConstructorArgument("serviceType", typeof(ActivitySink))
.WithConstructorArgument("baseAddresses", new Uri[0]);
}
}
public class Server
{
private readonly ServiceHost posHost;
private readonly ServiceHost activitySink;
public Server(IDataProvider dataProvider,
[Named("POS")] posHost,
[Named("ActivitySink")] activitySink)
{
this.posHost = posHost;
this.activitySink = activitySink;
}
}
Обратите внимание, что инициализация аргумента конструктора baseAddresses
необходима дляNinject, чтобы выбрать правильную перегрузку.Инициализация его new Uri[0]
, в частности, просто вызывает поведение по умолчанию при поиске в app.config
для поиска базовых адресов, поэтому не беспокойтесь о передаче пустого массива.
Хотя это объединяет ваш Server
классЧтобы внедрить себя, обычно ваши ServiceHost
экземпляры создаются в двоичном файле приложения, а не в библиотеке, поэтому связь не является проблемой.
Я предпочитаю этот подход синтаксису When
, поскольку он менее вероятенсломаться во время рефакторинга.Не исключено, что однажды кто-нибудь решит изменить имена параметров конструктора, и нет никаких визуальных указаний на то, что что-то зависит от этих имен, и нет никакого способа для автоматического рефакторинга Visual Studio обнаружить эту зависимость.
Итак, IMO, лучше сделать зависимость явной здесь, используя атрибуты;таким образом, если кто-то решит добавить третий сервисный хост позже, он сразу узнает, что ему нужно добавить атрибут и обновить соответствующий модуль Ninject.