1

これは私のシナリオです:

 public class Foo
    {
        private readonly List<Lazy<IAnimal>> _animals;

        public Foo(List<Lazy<IAnimal>> animals )
        {
            _animals = animals;
        }

        public void Bark()
        {
            //Line: *
            var dog = _animals.First(p => p.GetType() == typeof (Dog)).Value;
        }

        Public void Mio()
        {
            //Line: *
            var dog = _animals.First(p => p.GetType() == typeof (Cat)).Value;
        }
    }

    public class Dog:IAnimal
    {
    }

    public class Cat:IAnimal
    {
    }

    public interface IAnimal
    {
    }

質問:

ここで、動物のリストはクラス Foo に遅延注入されます。

Line * with のようなことをしたいですNinject。ご存知かもしれませんが、問題は、クラスを解決する前に、GetType()が返されることNullです。では、いつでもリスト内の項目の 1 つだけを解決するにはどうすればよいでしょうか?

そのようなことはできますNinjectか、それとも DI コンテナーを変更する必要がありますか?

4

2 に答える 2

0

これはニワトリが先か卵が先かという問題です: 値を取得しない限り型はわかりません。これを解決するには、事前にわかっているリストに追加情報を追加する必要があります。

これは、 System.ComponentModel.Compositionアセンブリの一部であるLazy<T, TMetadata> に適しています。

public class Foo
{
    private readonly List<Lazy<IAnimal, Type>> _animals;

    public Foo(List<Lazy<IAnimal, Type>> animals)
    {
        _animals = animals;
    }

    public void Bark()
    {
        var dog = _animals.First(p => p.Metadata == typeof(Dog)).Value;
    }
}

アップデート

コメントで述べたように、私は Ninject の専門家ではありませんが、組み込みのサポートがない場合でも、ほとんどのことはフレームワークで実行できます。これは、あなたの登録がどのように見えるかだと思います。Ninject 構文が間違っている可能性がありますが、次のようになります。

var list = new List<Lazy<IAnimal, Type>>();

list.Add(new Lazy<IAnimal, Type>(() => kernel.Get<Dog>(), typeof(Dog)));
list.Add(new Lazy<IAnimal, Type>(() => kernel.Get<Pussy>(), typeof(Pussy)));
list.Add(new Lazy<IAnimal, Type>(() => kernel.Get<Horse>(), typeof(Horse)));

kernel.Bind<List<Lazy<IAnimal, Type>>().ToConstant(list);
于 2013-07-24T19:27:43.417 に答える