0

に工場を入力:LightInjectたちは、型指定されたファクトリを作成し、このようにそれに値を渡すことができ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); 

これで私の質問は明示的にインスタンス化します新しいファクト(値)を登録します。しかし、値に基づいて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)); 

答えて

0

私たちの工場のGetFooメソッドでは、代理人を呼び出すのではなく、参照を渡していることを覚えておくことが重要です。この呼び出しは、(Fooオブジェクトをインスタンス化して)ファクトリを登録するときです。 だから私がやったことは、「値」に基づいてIFooの実装を生成し、静的なファクトリクラスを作成することでした。だから私はでデリゲートを呼び出す

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

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

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

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

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

です。これを行います
Assert.AreEqual(foo.GetType(),typeof(AnotherFooThatImplementsIFoo)); 
関連する問題