Фабрика делегатов 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);
});