Замок Виндзор эквивалентен WhenClassHas от ninject - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь преобразовать некоторые приложения, использующие Ninject, в Castle Windsor, чтобы устранить некоторые зависимости.

Я не могу понять, как реализовать некоторые функциональные возможности Ninject с помощью контейнера. Методы регистрации в Windsor.

А именно (в Ninject):

Kernel.Bind<ISessionProvider>().To<UnitOfWorkSessionProvider>();
Kernel.Bind<ISessionProvider>().To<ThreadSafeSessionProvider>()
  .WhenClassHas<RequireThreadSafeSession>();

Thisсообщает Ninject, что при создании класса с ISessionProvider в конструкторе используйте UnitOfWorkSessionProvider, если только у него нет атрибута RequireThreadSafeSession, и в этом случае ему присваивается ThreadSafeSessionProvider.

Вопрос первый - это можно сделать в Windsor?Документация немного запутанная.

Вопрос второй - как это сделать?Кажется, что условное связывание разрешено в классе конфигурации AllTypes, но шаблоны использования не столь прозрачны

1 Ответ

2 голосов
/ 15 апреля 2011

Вы можете использовать UsingFactoryMethod в API регистрации, чтобы использовать позднюю привязку и принять решение о реализации. Попробуйте это:


container.Register(Component.For<ThreadSafeSessionProvider>());
container.Register(Component.For<UnitOfWorkSessionProvider>());
container.Register(Component.For<ISessionProvider>().UsingFactoryMethod((x, u) => FindImpl(x, u)));
container.Register(Component.For<ClassUnderTest>());

private ISessionProvider FindImpl(IKernel kernel, CreationContext context)
{
   var classUnderTest = context.Handler.ComponentModel.Implementation;
   if (classUnderTest.HasAttribute<IsThreadSafeAttribute>())
   {
      return kernel.Resolve<ThreadSafeSessionProvider>();
   }

   return kernel.Resolve<UnitOfWorkSessionProvider>();
}

...