Фабрика делегатов Autofac с использованием func

Я пытаюсь понять шаблон фабрики делегатов с Autofac. Я знаю, как реализовать factory с помощью iindex с регистрацией Keyed (), которая хорошо объясняется здесь: настройка фабрики делегатов Autofac, определенной в абстрактном классе

Я хотел бы знать, могу ли я создать фабрику с помощью Func, и как бы я сделал регистрацию для следующего образца:

public enum Service
{
   Foo,
   Bar
}

public interface FooService : IService 
{
   ServiceMethod();
}

public interface BarService : IService 
{
   ServiceMethod();
}

public class FooBarClient
{
   private readonly IService service;

   public FooBarClient(Func<Service, IService> service)
   {
      this.service = service(Service.Foo);
   }

   public void Process()
   {
      service.ServiceMethod(); // call the foo service.
   }
}

1 ответов


Autofac не может построить этот Func<Service, IService> для вас, который позволяет возвращать различные типы на основе параметра. Это IIndex<> для.

однако если вы не хотите/не можете использовать IIndex<> вы можете создать эту функцию фабрики с помощью Keyed или Named и зарегистрируйте вашу фабрику в контейнере:

var builder = new ContainerBuilder();
builder.RegisterType<FooBarClient>().AsSelf();
builder.RegisterType<FooService>().Keyed<IService>(Service.Foo);
builder.RegisterType<BarService>().Keyed<IService>(Service.Bar);

builder.Register<Func<Service, IService>>(c => 
{
    var context = c.Resolve<IComponentContext>();
    return s => context.ResolveKeyed<IService>(s);
});