仅解决列表中的一个项目<;懒惰<;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容器?
这是一个鸡和蛋的问题:除非得到值,否则你不知道类型。你只能通过向列表中添加事先已知的额外信息来解决这个问题。
这非常适合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();