仅解决列表中的一个项目<;懒惰<;T>>;与Ninject合作

本文关键字:lt gt Ninject 合作 懒惰 项目 一个 列表 解决 | 更新日期: 2023-09-27 18:24:51

这是我的场景:

 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中。

我想用Ninject做一些类似Line*的事情。正如您可能知道的那样,问题是在解析类之前,GetType()返回Null。那么,如何在需要时仅解决列表中的一个项目呢?

Ninject能做这样的事情吗?或者我必须更改我的DI容器?

仅解决列表中的一个项目<;懒惰<;T>>;与Ninject合作

这是一个鸡和蛋的问题:除非得到值,否则你不知道类型。你只能通过向列表中添加事先已知的额外信息来解决这个问题。

这非常适合Lazy<T、 TMetadata>它是System.ComponentModel.Composition程序集的一部分:

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

您可以使用System.Linq命名空间中提供的OfType扩展方法。

var dog = _animals.OfType<Dog>().First();