0

LightInject のドキュメントに従って、型付きファクトリを作成し、次のように値を渡すことができます。

public class Foo : IFoo
{
   public Foo(int value)
   {
       Value = value;
   }

   public int Value { get; private set; }
}

public interface IFooFactory
{
    IFoo GetFoo(int value);
}

public class FooFactory : IFooFactory
{
    private Func<int, IFoo> createFoo;

    public FooFactory(Func<int, IFoo> createFoo)
    {
        this.createFoo = createFoo;
    }

    public IFoo GetFoo(int value)
    {
        return createFoo(value);
    }
}

そして、次のように登録します。

container.Register<int, IFoo>((factory, value) => new Foo(value));
container.Register<IFooFactory, FooFactory>(new PerContainerLifetime());

そして、次のように GetFoo を呼び出すことができます。

var typedFooFactory = container.GetInstance<IFooFactory>();
var foo = typedFooFactory.GetFoo(42);

だから今私の質問は次のとおりです。工場の新しい Foo(value) を登録するときに、明示的に foo をインスタンス化します。しかし、値に基づいて GetFoo メソッド内でそれを実行したい場合はどうなるでしょうか?

public IFoo GetFoo(int value)
{
    switch (value)
    {
         case 1: return new Foo(1);
         case 2: return new FooThatImplementsIFoo(2);
         case 3: return new AnotherFooThatImplementsIFoo(3);
         default: return null;
    }
}

GetFoo を呼び出して、「値」に基づいて適切な実装を取得できるようにしたいと考えています。

var typedFooFactory = container.GetInstance<IFooFactory>();
var foo = typedFooFactory.GetFoo(3); 
Assert.AreEqual(foo.GetType(),typeof(AnotherFooThatImplementsIFoo));
4

1 に答える 1

2

重要なのは、ファクトリの GetFoo メソッド内では、デリゲートを呼び出すのではなく、デリゲートへの参照を渡すだけであることを覚えておくことです。呼び出しは、(Foo オブジェクトをインスタンス化することによって) ファクトリを登録するときです。そこで、「値」に基づいて IFoo の実装を生成する静的な Factory クラスを作成しました。

container.Register<int, IFoo>((factory, value) => FooFactory.GetInstance);

そして、私の FooFactory は次のようになります。

public static class FooFactory
{
    public static IFoo GetInstance(IServiceFactory serviceFactory, int value)
    {
        switch (value)
        {
            case 1:
            {
                return serviceFactory.GetInstance<Foo>();
            }
            case 2:
            {
                return serviceFactory.GetInstance<FooThatImplementsIFoo>();
            }
            case 3:
            {
                return serviceFactory.GetInstance<AnotherFooThatImplementsIFoo>();
            }
            default:
            {
                return null;
            }
        }
    }
}

したがって、次のようにしてデリゲートを呼び出します。

var typedFooFactory = container.GetInstance<IFooFactory>();
var foo = typedFooFactory.GetFoo(3); 

そして今、私の foo オブジェクトはタイプ AnotherFooThatImplementsIFoo です

Assert.AreEqual(foo.GetType(),typeof(AnotherFooThatImplementsIFoo));
于 2016-07-22T21:36:58.767 に答える