2010-05-28 5 views
2

Я начинаю с инъекции зависимостей, и у меня возникают проблемы с инъекцией зависимости в базовый класс.Ввод зависимости в базовый класс

У меня есть контроллер BaseController, который унаследовали мои другие контроллеры. Внутри этого базового контроллера я выполняю ряд проверок, таких как определение, имеет ли пользователь права на просмотр текущей страницы, проверку наличия некоторых переменных сеанса и т. Д.

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

Ошибка 1 «MyProject.Controllers.BaseController» не содержит конструктор, который принимает 0 аргумент

Это имеет смысл, но я просто не уверен, как вводить эту зависимость. Должен ли я использовать этот шаблон для использования базового контроллера вообще или должен ли я делать это более эффективным/правильным способом?

+0

Можете ли вы опубликовать код конструкторов BaseController? –

+4

Вместо того, чтобы исправить эту проблему, рассмотрите следующие правила: 1) Используйте композицию над наследованием. 2) Не выполняйте никаких работ в конструкторах. После того, как оба сделают вашу жизнь с DI проще. –

ответ

11

ваш BaseController конструктор должен быть, как этот

BacseConctoller(Info info) 
{ 
    this.info = info 
} 

то для всех Наследование класса их конструктор

ChildController(Info info):base(info) 
{ 
} 

в этом случае вы можете впрыснуть объект Info в базовом классе контроллера

+1

Г-н Seemann! Недавно я прочитал [вашу книгу] (http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501) :) – Bart

1

Марк прямо на деньги,

BaseClass(dependantObject object) 
{ 
Object = object; 
} 

поэтому для выполнения функции dependantObject, чтобы все подклассы могли получить доступ к базовому поведению, мы можем использовать инъекцию в подклассе и просто соединить базовый конструктор, передавая в нашем объекте «Ninjected».

SubClass() : this(null) {} 

SubClass(dependantObject object) : base(object) 
    { 

    } 

счастливое кодирование!