Autofac复合图案

Kon*_*rin 6 c# autofac

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

interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
    public CompositeService(IEnumerable<IService> services) { ... }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

更新:

我目前的注册是:

builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
    .As<IService>();
Run Code Online (Sandbox Code Playgroud)

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

可以改进吗?

Bry*_*tts 4

我还没有实现这个,甚至没有完全考虑过它,但我能实现的最好的语法是:

builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");
Run Code Online (Sandbox Code Playgroud)

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

现在该怎么写呢...