我注意到我经常需要实现复合模式。例如:
interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
public CompositeService(IEnumerable<IService> services) { ... }
...
}
我想在容器中将 CompositeService 注册为 IService 并注入依赖项。
(看起来有点类似于装饰器,但装饰一组服务而不是仅装饰一个服务)
在 autofac 中最好的方法是什么?
理想的解决方案是什么样的(对于 C#)?
Update:
我当前的注册是:
builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");
builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
.As<IService>();
它类似于手工装饰 in http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4
可以改进吗?
我还没有实现这个,甚至没有完全考虑过它,但我能实现的最好的语法是:
builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");
The elements
注册函数的参数类型为IEnumerable<IService>
并封装c.Resolve<IEnumerable<IService>>("impl")
.
现在该怎么写呢...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)