2010-05-14 4 views
1

Нужно ли мне делать что-то другое в абстрактном классе, чтобы получить инъекцию зависимостей, работающую с Ninject?Ninject: Abstract Class

У меня есть базовый контроллер со следующим кодом:

public abstract class BaseController : Controller 
{ 
    public IAccountRepository AccountRepository 
    { 
     get; 
     set; 
    } 
} 

Мой модуль выглядит следующим образом:

public class WebDependencyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAccountRepository>().To<AccountRepository>(); 
    } 
} 

И это мой Global.asax:

protected override void OnApplicationStarted() 
{ 
    Kernel.Load(new WebDependencyModule()); 
} 

protected override IKernel CreateKernel() 
{ 
    return new StandardKernel(); 
} 

Это работает, когда Я украшаю собственность IAccountRepository[Inject] атрибут.

+1

Отредактированный ответ немного - надеюсь, что в целом все ясно сейчас - не стесняйтесь следить за комментариями, если это не имеет смысла. BTW обязательно загрузите источник Ninject - это единственное лучшее место на планете за ответы о Ninject. Тесты - довольно хороший набор ответов. –

+0

А, это отличная идея. Конечно, проверьте исходный код. Благодаря! – Pickels

ответ

2

Не уверен, что вы пытаетесь сделать.

Похоже, что вы хотите сделать вложение имущества. Если это так, вы должны придерживаться атрибута.

Ninject случайно не пускается в свойства.

Даже если бы это было возможно, вы не хотели бы, чтобы это было с точки зрения попытки понять, что зависит от того, что (я отнял у меня полностью от ПИ).

Если вы хотите выполнить инъекцию конструктора, конкретному контроллеру необходимо будет запросить его и передать его на «BaseController».

Ninject будет проходить до Object и вводит свойства Attributed, но не обрабатывает классы abstract любым специальным способом.

Либо это, либо я чего-то не хватает.

+0

этот вид имеет смысл для меня, поскольку вы не предпочитаете вложение свойств, у вас есть пример кода? Мне кажется, вы бы где-то проходили в IKernal, эту часть я не совсем понимаю, не могли бы вы объяснить, пожалуйста? – Haroon

+0

@Haroon: Не могу придумать хороших примеров. Вы посмотрели на [ninject wiki] (https://github.com/ninject/ninject/wiki/Table-of-Contents)? Я говорю, что вы просто используете инъекцию конструктора повсюду. Отсутствие инъекции свойств в качестве быстрого способа для базового класса получить что-то введенное может быть разрешено только путем: а) перехода на место службы (плохое); б) создание производных конструкторов требует от вашего имени. Все, что требует базовый класс для ядра, не лучше, чем местоположение службы - по крайней мере, Propety Injection дает вам уровень косвенности. –

+0

thats, о чем я думаю, мне не нравится тот факт, что я должен передать в kernal/container и заставить ctor разрешить зависимость. Передача слишком много информации для этого класса по моему вкусу. Единственная проблема с Property Injection заключается в том, что вы привязываетесь к Ninject ... Я видел один пример, где я могу использовать typeof таким образом, что я не ссылаюсь на ninject, только мой атрибут ... в любом случае все это кажется мне очень взломанным особенно потому, что я использую контейнер IOC ... – Haroon