鉴于以下注册

builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();

var container = builder.Build();

我希望将类型I的所有实例解析为IEnumerable(数组或集合无关紧要)。

在温莎,我会写下以下内容。

foreach(I i in container.ResolveAll<I>())
{
 ...
}

我正从Windsor迁移到Autofac 1.4.4.561,但无法看到等效的语法。

有帮助吗?

解决方案

对于Autofac的当前版本:( 2.0 +,所以你今天应该使用的任何东西)

您注册了多个ILoggers(例如):

var builder = new ContainerBuilder();

builder.Register<ConsoleLogger>()
  .As<ILogger>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .PreserveExistingDefaults(); //keeps console logger as the default

然后获取所有ILogger s:

var loggers = container.Resolve<IEnumerable<ILogger>>();

您不需要做任何特别的事情,只需要一个IEnumerable<T>所需的类型。 Autofac提供开箱即用的集合支持,以及其他适配器可以使用其他功能包装您的组件。

这与2.x之前的ImplicitCollectionSupportModule的用法相同,但是直接烘焙。

旧版本(0.X - 1.4)

两种方式:

1)使用收集注册

var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
  .As<IEnumerable<ILogger>>();

builder.Register<ConsoleLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

然后:

builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;

给你一个IEnumerable。

或 2)您可以使用ImplicitCollectionSupport模块,它将使代码像较新版本的Autofac一样工作:

<*>

然后解决ILogger的集合,而不是寻求解决所有问题。

<*>

再次为您提供IEnumerable。

其他提示

为了新(2.x)版本的更新。你现在需要的只是:

container.Resolve<IEnumerable<I>>();

不再需要RegisterCollection()ImplicitCollectionSupportModule - 此功能开箱即用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top