简单注入器 - 注册抽象 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
});