17

Autofac でデリゲート ファクトリ パターンを理解しようとしています。Keyed() 登録で IIndex<> を使用してファクトリを実装する方法を知っています。これについては、ここでうまく説明されています:抽象クラスで定義された 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.
   }
}
4

1 に答える 1

22

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);
});
于 2013-03-15T08:15:01.633 に答える