使用func<>的Autofac委托工厂

时间:2013-03-14 22:29:22

标签: delegates autofac factory-pattern

我试图通过Autofac了解委托工厂模式。我知道如何使用IIndex<>实现工厂使用Keyed()注册,这里有很好的解释:Configuring an Autofac delegate factory that's defined on an abstract class

我想知道我是否可以使用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 个答案:

答案 0 :(得分:20)

Autofac无法为您构建此Func<Service, IService>,您可以根据参数返回不同的类型。这是IIndex<>的用途。

但是,如果您不想/不能使用IIndex<>,您可以在KeyedNamed的帮助下创建此工厂功能,并在容器中注册您的工厂:

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