3

リポジトリでは、アプリケーションの存続期間を通じて存続するいくつかのインスタンスを保持していますが、新しいインスタンスを container.GetInstance コンストラクターのオーバーライドに渡したとしても、そのようなインスタンスを別のインスタンスと LightInject にすぐに置き換える必要がある場合があります。

問題を示すスニペットを次に示します。

    internal class ClassA
    {
        public string Name { get; private set; }

        public ClassA(string name)
        {
            Name = name;
        }

        public override string ToString()
        {
            return Name;
        }
    }

    internal class ClassB
    {
        public ClassA A { get; private set; }

        public ClassB(ClassA a)
        {
            A = a;
        }

        public override string ToString()
        {
            return string.Format("I contain {0}", A);
        }
    }

    private void TestContainer()
    {
        var container = new LightInject.ServiceContainer();
        var a1 = new ClassA("A instance 1");
        container.Register(x => a1);
        container.Register<ClassB>();

        var a2 = new ClassA("A instance 2");
        var bwitha1 = container.GetInstance<ClassB>();
        if(bwitha1.A != a1)
        {
            throw new InvalidOperationException("This will not happen");
        }
        var bwitha2 = container.GetInstance<ClassA, ClassB>(a2);
        if(bwitha2.A != a2)
        {
            throw new InvalidOperationException("Something went wrong here");
        }
    }

GetInstance 呼び出しで明示的なインスタンスを指定すると、以前に登録された LightInject インスタンスが優先されるのはなぜですか? 問題を回避し、引数の 1 つの代替インスタンスを使用してオブジェクトを構築するにはどうすればよいですか?

4

1 に答える 1

2

現在のバージョンの LightInject では、ランタイム引数を使用する場合、ファクトリを提供する必要があります。

次の回避策が有効な場合があります。

using LightInject;

class Program
{
    static void Main(string[] args)
    {
        var container = new ServiceContainer();
        container.Register<Bar>();
        container.Register<Foo>();
        container.Register<Bar, Foo>((factory, bar) => new Foo(bar), "FooWithRuntimeArgument");            
        var instance = container.GetInstance<Foo>();            
        var instanceWithRuntimeArgument = container.GetInstance<Bar, Foo>(new Bar(), "FooWithRuntimeArgument");
    }
}

public class Foo
{                
    public Foo(Bar bar) {}        
}

public class Bar {}
于 2014-10-10T14:17:48.630 に答える