Используйте AllTypes.FromAssemblyContaining() / Используя FactoryMethod()

#inversion-of-control #castle-windsor #castle

#инверсия элемента управления #замок-Виндзор #замок

Вопрос:

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

 IoCContainer.Register(AllTypes.FromAssemblyContaining<RepositoryOne>).BasedOn(typeof(IRepository<>)).WithService.AllInterfaces().Configure(c => c.LifeStyle.Singleton));
  

Поскольку я хочу влиять на создание этих репозиториев, я пытаюсь использовать с ним UsingFactoryMethod() . Использовать этот метод просто, когда я регистрирую каждый репозиторий отдельно, например

 IoCContainer.Register(Component.For<IRepositoryOne>().ImplementedBy<RepositoryOne>().LifeStyle.Singleton.UsingFactoryMethod(() => Factory.New<RepositoryOne>()));
...
IoCContainer.Register(Component.For<IRepositoryN>().ImplementedBy<RepositoryN>().LifeStyle.Singleton.UsingFactoryMethod(() => Factory.New<RepositoryN>()));
  

Но как я могу использовать UsingFactoryMethod() вместе с кодом из первого примера?

TIA

Ответ №1:

Для его использования вам придется немного поразмыслить, поскольку у вас нет точного типа объекта, который вы бы разрешали.

 var factoryMethod = typeof(Factory).GetMethod("New", BindingFlags.Static|BindingFlags.Public);

container.Register(
   AllTypes.FromAssemblyContaining<RepositoryOne>)
      .BasedOn(typeof(IRepository<>))
      .WithService.AllInterfaces()
      .Configure(x => x.UsingFactoryMethod((k, c) => factoryMethod.MakeGenericMethod(c.RequestedType).Invoke(null, null)));
  

Комментарии:

1. Спасибо за ваш ответ! Похоже, что эта функциональность доступна только в версии из Git (в противном случае c.RequestedType не определен), что вызывает исключение безопасности при инициализации здесь. В любом случае, когда выйдет новая версия get, я попробую это снова.