Как Autofac помогает вводить несколько экземпляров класса / интерфейса в существующий класс одновременно - PullRequest
0 голосов
/ 23 апреля 2019

Я очень новичок в Autofac и до сих пор не понимаю весь потенциал. Давайте возьмем пример, рассмотренный в кратком руководстве по автозапуску в документации сайта. (https://autofac.readthedocs.io/en/latest/getting-started/index.html)

using System;

namespace DemoApp
{

 public interface IOutput
 {
   void Write(string content);
 }

 public class ConsoleOutput : IOutput
 {
    public void Write(string content)
    {
        Console.WriteLine(content);
    }
  }

  public interface IDateWriter
  {
     void WriteDate();
  }

  public class TodayWriter : IDateWriter
  {
     private IOutput _output;
     public TodayWriter(IOutput output)
     {
         this._output = output;
     }

     public void WriteDate()
     {
         this._output.Write(DateTime.Today.ToShortDateString());
     }
 }
}

А клей 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();
  }
}

Цель этой программы - просто напечатать дату и время на консоли. Предположим теперь, что я хочу напечатать дату и время не только в консоли, но и в журналах. Для этой цели я хочу создать еще один класс с интерфейсом IOutput следующим образом:

public class LogsOutput : IOutput
{
    public void Write(string content)
    {
        // write content to a log file here
    }
 }

Это чистый пример. Я хочу расширить этот пример для большей проблемы. Теперь, как должен выглядеть код клея Autofac? чтобы код выполнял оба класса ConsoleOutput classe и LogsOutput и печатал выходные данные как в консоли, так и в файле журнала?

Можно ли этого добиться с помощью Autofac или это не в поведении autofac? Я, возможно, хочу добавить сотни классов с интерфейсом IOutput. Как этого добиться с помощью Autofac?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

После создания нового типа IOutput,

Сначала необходимо зарегистрировать его в контейнере, используя Named :

var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutput>().Named<IOutput>("console");
builder.RegisterType<LogsOutput>().Named<IOutput>("logs");
builder.RegisterType<TodayWriter>().As<IDateWriter>();
Container = builder.Build();

Затем вWriteDate() метод, который вы указываете тип Ioutput для использования, вызывая ResolveNamed метод с параметром name, который является именем, указанным при регистрации типа:

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();
  }
}

Примечание: если выне работают с string именами, вы можете использовать Keyed , которые работают с enumeration s.

0 голосов
/ 23 апреля 2019

AutoFac напрямую поддерживает это, принимая зависимость от IEnumerable<T>.Когда он видит IEnumerable, он вернет коллекцию всех зарегистрированных типов, которые удовлетворяют интерфейсу T.

. В вашем случае зарегистрируйте и LogsOutput, и ConsoleOutputкак IOutput и разрешить IEnumerable<IOutput>, чтобы получить обе зарегистрированные услуги.


Более подробную информацию можно найти здесь .

Зависимости отперечислимый тип обеспечивает несколько реализаций одного и того же сервиса (интерфейса).Это полезно в таких случаях, как обработчики сообщений, когда приходит сообщение и регистрируется более одного обработчика для обработки сообщения.

...