Autofac复合图案

2023-11-25

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

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(使用前将#替换为@)

Autofac复合图案 的相关文章