在 Mike Hadlow 的博客上看到一篇文章,该文章使用在 Windsor 注册的委托返回多个命名类型注册中的一个......
所以基本上温莎注册可能看起来像这样......
container
.Register(
Component.For<IReportFormatter>().ImplementedBy<ReportFormatterWord2003>().Named("word2003"),
Component.For<IReportFormatter>().ImplementedBy<ReportFormatterWord2007>().Named("word2007"),
Component.For<IReportFormatter>().ImplementedBy<ReportFormatterPdf>().Named("pdf"),
Component.For<Func<string, IReportFormatter>>().Instance(container.Resolve<IReportFormatter>),
Component.For<Foo>());
Foo 构造函数将采用委托类型的参数
Foo(Func<string, IReportFormatter> reportFormatterFactory)
现在,当 Windsor 解析 Foo 时,reportFormatterFactory 不会解析为 IReportFormatter 的实现,而是简单地保存对 container.Resolve 方法的引用......
container.Resolve<IReportFormatter>(string)
以后可以通过调用来获取正确的 IReportFormatter...
reportFormatterFactory("word2007");
也许不像注册工厂那么容易理解,但不需要工厂类。