简单注入器 - 注册抽象 class 实现的 IEnumerable
Simple Injector - register IEnumerable of abstract class implementations
我正在使用 Simple Injector,想看看是否可以 register/resolve 继承抽象 class 的 classes 的集合 class。
场景如下:
我有以下 abstract/concrete classes:
public abstract class Animal
{
public string Type { get; set; }
public abstract string MakeSound();
}
public class Dog : Animal
{
public override string MakeSound()
{
return "woof";
}
}
public class Cat : Animal
{
public override string MakeSound()
{
return "meow";
}
}
public class Pig : Animal
{
public override string MakeSound()
{
return "oink";
}
}
此外,我有一个 class,它应该接收一个 IEnumerable<Animal>
并为每只动物调用 MakeSound
函数,如下所示:
public class Zoo
{
private IEnumerable<Animal> _animals;
public Zoo(IEnumerable<Animal> animals)
{
_animals = animals;
}
public void MakeZooNoise()
{
foreach (var animal in _animals)
{
animal.MakeSound();
}
}
}
我想建立 IEnumerable<Animal>
集合,最好在容器初始化时使用,并让它通过简单注入器处理,因为在这个子 classes 中也使用了其他注册(不是在这种情况下,但在真实的例子中)。
注意:如果有替代方法的想法,也欢迎!
container.RegisterCollection<Animal>(new[] {
typeof(Cat),
typeof(Dog),
typeof(Pig)
});
// or using Auto-Registration
container.RegisterCollection<Animal>(new [] {
typeof(Animal).Assembly
});
我正在使用 Simple Injector,想看看是否可以 register/resolve 继承抽象 class 的 classes 的集合 class。
场景如下: 我有以下 abstract/concrete classes:
public abstract class Animal
{
public string Type { get; set; }
public abstract string MakeSound();
}
public class Dog : Animal
{
public override string MakeSound()
{
return "woof";
}
}
public class Cat : Animal
{
public override string MakeSound()
{
return "meow";
}
}
public class Pig : Animal
{
public override string MakeSound()
{
return "oink";
}
}
此外,我有一个 class,它应该接收一个 IEnumerable<Animal>
并为每只动物调用 MakeSound
函数,如下所示:
public class Zoo
{
private IEnumerable<Animal> _animals;
public Zoo(IEnumerable<Animal> animals)
{
_animals = animals;
}
public void MakeZooNoise()
{
foreach (var animal in _animals)
{
animal.MakeSound();
}
}
}
我想建立 IEnumerable<Animal>
集合,最好在容器初始化时使用,并让它通过简单注入器处理,因为在这个子 classes 中也使用了其他注册(不是在这种情况下,但在真实的例子中)。
注意:如果有替代方法的想法,也欢迎!
container.RegisterCollection<Animal>(new[] {
typeof(Cat),
typeof(Dog),
typeof(Pig)
});
// or using Auto-Registration
container.RegisterCollection<Animal>(new [] {
typeof(Animal).Assembly
});