我注意到我经常需要实现复合模式.例如:
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
可以改进吗?
我还没有实现这个,甚至没有完全考虑过它,但我能实现的最好的语法是:
builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");
Run Code Online (Sandbox Code Playgroud)
注册函数的参数elements将是类型IEnumerable<IService>并封装c.Resolve<IEnumerable<IService>>("impl").
现在该怎么写呢...
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |