に工場を入力: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));