При использовании Ninject инъекции собственности следующие работы только если объект инстанцированный в рамках (а не разработчиком в коде), так что инъекции работает:инъекции собственности при инициализации объекта вручную
public class SomeController: Controller {
[Inject]
public DbContext db {get; set;}
...
}
Однако, когда объект должен быть инстанцирован в коде разработчиком, привязка не происходит (я не хочу сказать, что терпеть неудачу, потому что этого не происходит).
public class DataProvision {
[Inject]
public DbContext db {get; set;}
public List<T> GetList<T>() where T: class, new() {
return db.Set<T>().toList();
}
...
}
public class Test {
public static void Test(){
DataProvision dp = new DataProvision();
var getValue = dp.GetList<Person>();
}
}
Поддерживается ли это даже при поддержке Ninject, и если да, то в чем заключается решение.
Обоснование, почему мы делаем это: переключение между резервными базами данных и активных усилий в БД случае чрезвычайной ситуации
Вот почему вы должны одобрить инъекцию конструктора над инъекцией свойств. Ввод свойств приводит к [Temporal Coupling] (http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/), который является дизайнерским запахом. «DataProvision» должен требовать зависимость «DbContext» в своем конструкторе. – Steven
@Steven: Это не имеет никакого значения, потому что в этом случае вам нужно пройти в объекте. Зачем? этот класс DataProvision должен предоставлять DropdownMenues в общем виде в представлениях MVC (он не используется в другом конроллере). Поэтому мы фактически не хотим, чтобы DbContext находился в конструкторе. Однако эта проблема решается путем получения db из ядра, чтобы воспользоваться привязкой. – Arrrr
Вы не должны позволять вашему взгляду иметь какие-либо зависимости. Представления должны быть немыми, и контроллер должен передать все данные, которые требует просмотр. – Steven