利用AllTypes.FromAssemblyContaining()/ UsingFactoryMethod()

时间:2011-05-19 12:04:04

标签: 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 个答案:

答案 0 :(得分:0)

你必须使用一些反射才能使用它,因为你没有你要解析的对象的确切类型。

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