C# Autofac如何帮助您在现有类中同时注入类/接口的多个实例

C# Autofac如何帮助您在现有类中同时注入类/接口的多个实例,c#,autofac,ioc-container,C#,Autofac,Ioc Container,我对Autofac非常陌生,仍然不了解所有的潜力。 让我们以网站文档中的quick autofac教程中考虑的示例为例 Autofac胶水如下所示: using System; using Autofac; namespace DemoApp { public class Program { private static IContainer Container { get; set; } static void Main(string[] args) {

我对Autofac非常陌生,仍然不了解所有的潜力。 让我们以网站文档中的quick autofac教程中考虑的示例为例

Autofac胶水如下所示:

using System;
using Autofac;

namespace DemoApp
{
   public class Program
   {
     private static IContainer Container { get; set; }

   static void Main(string[] args)
   {
       var builder = new ContainerBuilder();
       builder.RegisterType<ConsoleOutput>().As<IOutput>();
       builder.RegisterType<TodayWriter>().As<IDateWriter>();
       Container = builder.Build();

       WriteDate();
   }
  }
}


public static void WriteDate()
 {
  // Create the scope, resolve your IDateWriter,
  // use it, then dispose of the scope.
  using (var scope = Container.BeginLifetimeScope())
  {
    var writer = scope.Resolve<IDateWriter>();
    writer.WriteDate();
  }
}
public class LogsOutput : IOutput
{
    public void Write(string content)
    {
        // write content to a log file here
    }
 }
这是一个纯粹的例子。我想把这个例子扩展到一个更大的问题。 现在,Autofac胶水代码应该是什么样子?为了让代码同时执行ConsoleOutput类和LogsOutput类,并将输出打印到控制台和日志文件

是否可以通过Autofac实现这一点,或者这不是Autofac的行为? 我可能希望能够添加数百个类,所有这些类都使用IOutput接口。如何使用Autofac实现这一点?

创建新的输出类型后

首先,您需要在容器中注册它,使用:


注意:如果您不使用字符串名称,可以使用哪个用于枚举。

AutoFac通过依赖IEnumerable直接支持这一点。当它看到IEnumerable时,它将返回满足接口T的所有注册类型的集合

在您的情况下,将LogsOutput和ConsoleOutput注册为IOutput,并解析IEnumerable,以获得两个已注册的服务

可以找到更多细节

可枚举类型的依赖项提供了 相同的服务接口。这在诸如message之类的情况下很有用 处理程序,其中传入一条消息,并调用多个处理程序 已注册以处理该消息


你应该看看或者。让我知道,如果你喜欢以你的案例为基础的例子,为什么投反对票?也许这个问题应该修改一下?非常感谢。我看了两遍。var作家。可能是打字错误?是的,我更新了答案,我想告诉你如何在这两种情况下实例化作者。
public class LogsOutput : IOutput
{
    public void Write(string content)
    {
        // write content to a log file here
    }
 }
var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutput>().Named<IOutput>("console");
builder.RegisterType<LogsOutput>().Named<IOutput>("logs");
builder.RegisterType<TodayWriter>().As<IDateWriter>();
Container = builder.Build();
public static void WriteDate()
 {
  // Create the scope, resolve your IDateWriter,
  // use it, then dispose of the scope.
  using (var scope = Container.BeginLifetimeScope())
  {
    var writer = scope.ResolveNamed<IDateWriter>("console"); // for console output
    //var writer = scope.ResolveNamed<IDateWriter>("logs"); // for logs output
    writer.WriteDate();
  }
}