Ninject указывает область привязки не ссылающегося компонента
У меня есть библиотека, которая предназначена для настольных и веб-приложений.
Эта библиотека имеет ссылку на внешний компонент доступа к данным, который на рабочем столе должен быть привязан как singleton, а в Интернете - по запросу.
- Ссылки на настольные проекты Базовый проект
- Ссылки на веб-проекты Базовый проект
- Основные ссылки проекта ExternalComponent
Сегодня я вынужден сделать это на веб-клиенте:
Bind<ExternalComponent.IDataAccessComponent>()
.To<ExternalComponent.DataAccessComponent()
.InRequestScope()
.WithConstructorArgument(...);
И на настольном клиенте, то же самое, но с InSingletonScope()
что заставляет мои веб-приложения и приложения для настольных компьютеров ссылаться на ExternalComponent.dll, что не является моей целью.
Как сделать привязку, чтобы я мог указать клиенту (в Интернете или на рабочем столе) область действия, в которой должен быть включен этот внешний компонент, без указания клиентом ссылки на этот компонент доступа к данным?
Я думаю о каком-то методе в базовом проекте, который получает необходимую для клиента область и настраивает ее, но я не могу найти что-то в Ninject API, которое позволяет мне это сделать.
1 ответ
Я не уверен, почему это необходимо, но это возможно только при использовании синтаксиса, который принимает System.Type
:
public class CoreModule : NinjectModule
{
public override void Load()
{
this.Extend(this.Bind(typeof(IDataAccessComponent)).To(typeof(DataAccessComponent))).WithConstructorArgument("foo", "bar");
}
protected virtual IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
{
return bindingWhenInNamedWithOrOnSyntax;
}
}
public class WebClientModule : CoreModule
{
protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
{
return bindingWhenInNamedWithOrOnSyntax.InRequestScope();
}
}
public class ClientModule : CoreModule
{
protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
{
return bindingWhenInNamedWithOrOnSyntax.InSingletonScope();
}
}
Вышесказанное удаляет семантику сильного связывания.