Autofac复合图案

我注意到我经常需要实现复合模式。 例如:

interface IService { ... } class Service1 : IService { ... } class Service2 : IService { ... } class CompositeService : IService { public CompositeService(IEnumerable services) { ... } ... } 

我想在容器中注册CompositeService作为IService并注入依赖项。

(看起来有点类似于装饰者,但装饰一组服务而不是一个)

在autofac中执行此操作的最佳方法是什么?

理想的解决方案将如何(对于C#)?

更新:

我目前的注册是:

 builder.RegisterType().Named("impl"); builder.RegisterType().Named("impl"); builder.Register(c => new CompositeService(c.Resolve<IEnumerable>("impl"))) .As(); 

它类似于装饰手工在http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

可以改进吗?

我没有实现这个,甚至没有完全考虑过,但我能达到的最佳语法是:

 builder .RegisterComposite((c, elements) => new CompositeService(elements)) .WithElementsNamed("impl"); 

注册函数的elements参数将是IEnumerable类型,并封装c.Resolve>("impl")

现在怎么写呢……

您可以尝试命名或键控注册。 命名注册只是获取一个字符串名称,以区别于同一接口的其他注册。 类似地,密钥使用某种值类型(例如枚举)来区分多个注册。 您的CompositeService可能是默认引用,按类型注册,不需要其他特殊信息。 您需要一些方法来解析其他IService依赖项并将它们传递给构造函数; CompositeService的工厂方法可能有效。