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();
    }
}

Вышесказанное удаляет семантику сильного связывания.

Другие вопросы по тегам