17

我正在尝试使用 Autofac 了解委托工厂模式。我知道如何使用带有 Keyed() 注册的 IIndex<> 来实现工厂,这里很好地解释了这一点: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.
   }
}
4

1 回答 1

22

Autofac 无法Func<Service, IService>为您构造它,它允许您根据参数返回不同的类型。这是IIndex<>为了什么。

但是,如果你不想/不能使用,你可以在orIIndex<>的帮助下创建这个工厂函数,并在容器中注册你的工厂: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);
});
于 2013-03-15T08:15:01.633 回答