2013-12-04 4 views
6

У меня есть базовый класс, а также ряд других классов, наследующих от этого:
(Прошу прощения за чрезмерной эксплуатации животных аналогии)регистрирующие реализации базового класса с Autofac пройти в через IEnumerable

общественного абстрактного класса Animal {}

общественного класса Dog: Animal {}

общественного класса Cat: Animal {}

Я тогда есть класс, который имеет Зависимость от на качестве IEnumerable<Animal>

public class AnimalFeeder 
{ 
    private readonly IEnumerable<Animal> _animals; 

    public AnimalFeeder(IEnumerable<Animal> animals) 
    { 
     _animals = animals; 
    } 
} 

Если я вручную сделать что-то вроде этого:

var animals = 
    typeof(Animal).Assembly.GetTypes() 
     .Where(x => x.IsSubclassOf(typeof(Animal))) 
     .ToList(); 

Тогда я могу видеть, что это возвращает Dog и Cat

Однако, когда я пытаюсь подключить свой автозагрузчик следующим образом:

builder.RegisterAssemblyTypes(typeof(Animal).Assembly) 
    .Where(t => t.IsSubclassOf(typeof(Animal))); 

builder.RegisterType<AnimalFeeder>(); 

Когда создается объект AnimalFeeder, в конструктор передается Animal.

Я что-то пропустил?

+2

Вы, вероятно, с отсутствующим 'Как ()' в вашем registartion: 'builder.RegisterAssemblyTypes (TypeOf (Animal) .assembly) .где (т => t.IsSubclassOf (typeof (Animal))). Как (); ' – nemesv

+0

Можете преобразовать этот комментарий в ответ! ;-) Спасибо – Alex

+0

Похоже, у меня есть накопитель downvoter .... – Alex

ответ

13

Вам не нужен звонок As<Animal>() в вашей регистрации.

Без него Autofac будет регистрировать ваши типы с настройкой по умолчанию AsSelf(), поэтому вы не получите свои классы, если попросите базовый тип с IEnumerable<Animal>, только если вы используете подтипы, такие как Dog и Cat.

Так измените регистрации:

builder.RegisterAssemblyTypes(typeof(Animal).Assembly) 
    .Where(t => t.IsSubclassOf(typeof(Animal))) 
    .As<Animal>(); 
+0

Я знаю, что этот вопрос старый, но что, если вы хотите зарегистрировать именованный подкласс абстрактного класса? – Cizaphil

+1

Именованные регистрации также могут быть разрешены с помощью 'IEnumarable ', если они зарегистрированы с типом ** и ** именем. Итак, 'builder.RegisterType () .As () .Name (« Собака »); builder.RegisterType () .As () .Named («Cat»); 'в этом случае' IEnumerable 'будет возвращать оба, но вы также можете решить отдельные из них:' container.ResolveNamed («Собака «);'. Вы можете даже объединить его со сборочным сканированием: 'builder.RegisterAssemblyTypes (...). Как ();' и затем зарегистрировать свои именованные дополнительно: 'builder.RegisterType () .Named (« Собака »); ' – nemesv

+0

Хорошо, спасибо, я ценю – Cizaphil

Смежные вопросы