Используйте AllTypes.FromAssemblyContained () / UsingFactoryMethod () - PullRequest
0 голосов
/ 19 мая 2011

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

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 () вместе с кодом из первого примера?

ТИА

1 Ответ

0 голосов
/ 20 мая 2011

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

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)));
...