Ninject: Bind ServiceHost экземпляр для использования с дуплексной службой WCF
Я работаю над службой WCF, которая использует дуплексный канал, чтобы позволить службе перезванивать клиенту для передачи события, вызванного компонентом на уровне службы. Прокси-класс определен и построен следующим образом:
public class EvsMembershipProxy : DuplexClientBase<IMembershipProviderCallback>, IEvsMembershipProvider
{
public EvsMembershipProxy(InstanceContext callbackInstance): base(callbackInstance)
{
}
}
Мне нужно получить экземпляр этого класса в классе, который настроен с использованием системы членства ASP.NET, поэтому я связываю его так:
_ninjectKernal.Bind<IEvsMembershipProvider>().To<EvsMembershipProxy>();
и я делаю это так:
public class EvsMembershipProvider : MembershipProvider, IMembershipProviderCallback
{
#region "Dependencies"
[Inject]
public IEvsMembershipProvider MembershipProvider { get; set; }
#endregion
}
Настроенный поставщик членства внедряется Ninject следующим образом:
_ninjectKernal.Inject(System.Web.Security.Membership.Provider);
_ninjectKernal.Inject(System.Web.Security.Roles.Provider);
Я проверил шаблон внедрения с уровнем службы WCF без службы дуплекса, и он работает правильно. Однако, когда я включаю дуплексную службу, во время привязки происходит сбой Ninject со следующей ошибкой:
Error activating ServiceHostBase
No matching bindings are available, and the type is not self-bindable.
Activation path:
4) Injection of dependency ServiceHostBase into parameter host of constructor of type InstanceContext
3) Injection of dependency InstanceContext into parameter callbackInstance of constructor of type EvsMembershipProxy
2) Injection of dependency IEvsMembershipProvider into property MembershipProvider of type EvsMembershipProvider
1) Request for EvsMembershipProvider
Suggestions:
1) Ensure that you have defined a binding for ServiceHostBase.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.
Похоже, мне понадобится привязка для класса ServiceHostBase, используемого в конструкторе EvsMembershipProxy, чтобы решить эту проблему. Однако я не знаю, как это настроить. Моя лучшая попытка разрешить привязку ServiceHostBase была:
_ninjectKernal.Bind<ServiceHostBase>().ToMethod(c => OperationContext.Current.Host);
Однако это не удается с исключением нулевой ссылки во время привязки.
Как связать тип ServiceHostBase, чтобы эта инъекция работала?
** РЕДАКТИРОВАТЬ: упростил исходный код, чтобы удалить некоторые аргументы конструктора EvsMembershipProxy, которые могут быть предоставлены конфигурацией WCF **
1 ответ
Обнаружено, что я могу настроить это следующим образом.
_ninjectKernal.Bind<IEvsMembershipProvider>()
.To<EvsMembershipProxy()
.WithConstructorArgument("callbackInstance", Membership.Provider);
Сконфигурированный поставщик членства реализует интерфейс IMembershipProviderCallback и получает обратный вызов от службы.