Castle Windsor:如何使用Func <t>和UsingFactoryMethod注册一个开放的泛型类型进行注射?</t>

时间:2011-05-05 03:09:13

标签: castle-windsor

我有一个通用接口IRepository,它有一个具体的通用实现MyRepository。我使用以下代码一次性注册所有可能的类型T:

container.Register(CastleReg.Component.For<typeof(IRepository<>)).ImplementedBy(typeof(MyRepository<>)).LifeStyle.Transient)

我注册了其他类,他们自己在构造函数中有这样的东西:

public SomeClass(IRepository<Person> myRep)
{
   ...

这个问题是SomeClass类可能已经注册为Singleton LifeStyle,这意味着myRep属性被解析一次。为了在实际需要时解决myRep,我了解到我可以使用以下语法:

public SomeClass(Func<IRepository<Person>> myRepFactory)

然后使用以下内容获取实际存储库:

myRepFactory().DoSomeQuery()

现在我的问题是如何告诉容器myRepFactory应该解析为一个工厂方法,它本身会像以前一样解决?

我认为我可以将其添加到注册中,但注册失败,并且关键参数的ArgumentNullException:

container.Register(CastleReg.Component.For(typeof(Func<>).MakeGenericType(typeof(IRepository<>))).UsingFactoryMethod(() => container.Resolve(typeof(IRepository<>))).LifeStyle.Transient)

如何设置注册,以便它可以解析IRepository<Person>参数类型和Func<IRepository<Person>>参数类型?

提前致谢,

标记

P.S。我正在使用Castle.Windsor 2.5.1

1 个答案:

答案 0 :(得分:3)

只需使用支持开箱即用的TypedFactoryFacility