Привязка на основе Ninject Convention с разным стилем жизни

Я пытаюсь использовать привязки на основе Ninject 3 Convention и хотел бы указать, с каким стилем жизни должна быть связана служба во время привязки.

Я пытаюсь использовать приведенный ниже код, но безуспешно; ошибки моего приложения, говорящие о том, что мои службы не привязаны. Я знаю, что могу написать свой собственный биндер и выполнить всю работу по отражению самостоятельно, но это выглядело довольно красиво. Я что-то упускаю?

Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
      .SelectAllClasses()
      .BindDefaultInterface()
      .Configure(cfg =>
       {
          cfg.InTransientScope();
          cfg.WhenClassHas<BindAsASingletonAttribute>().InSingletonScope();
          cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();
       }));

Спасибо,

Джон


person Jon Bates    schedule 19.04.2014    source источник


Ответы (1)


В обратном вызове Configure вы собираете конфигурацию, которая используется во всех привязках, и когда вы пишете несколько операторов WhenClassHas и In...Scope, вы в основном переопределяете свои собственные настройки, поэтому все ваши привязки типов будут использовать последний оператор cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();.

Чтобы решить эту проблему, вам нужно использовать вторую перегрузку Configure, где вы получаете текущий связанный тип и на основе его атрибутов регистрируете свой тип с правильной областью действия:

using Ninject.Infrastructure.Language; //needed for HasAttribute<T>

//...

Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
      .SelectAllClasses()
      .BindDefaultInterface()
      .Configure((cfg, type) =>
      {
          if (type.HasAttribute<BindAsASingletonAttribute>())
              cfg.InSingletonScope();
          else if (type.HasAttribute<BindInRequestScopeAttribute>())
              cfg.InRequestScope();
          else
              cfg.InTransientScope();
      }));
person nemesv    schedule 20.04.2014
comment
Ах! Я надеялся, что каждый оператор просто изменит конфигурацию, если предикаты совпадут. Я видел другого делегата, но читал, что это была услуга, а не реализация (довольно продуктивная сессия, ха-ха!). Я проверю это, когда вернусь домой, и тогда отмечу, спасибо - person Jon Bates; 20.04.2014