Если вы используете плагин Ninject для MVC 3, то неплохо создать все доступные хуки.Я думаю есть поддержка представлений Razor: если вы создадите класс, который расширяет типичный класс View и добавит в него вставленные зависимости, я думаю, что Ninject сможет внедрить эти элементы, чтобы они были доступны длявы в представлении.
Для моих представлений я предпочел использовать настраиваемые методы расширения на основе HtmlHelper, которые в конечном итоге косвенно используют шаблон Service Locator на основе одноэлементного доступа для доступа к соответствующим зависимостям.Если вы обнаружите, что нет смысла говорить Html.MyMethod(...)
или Url.MyMethod(...)
или что-то в этом роде, есть большая вероятность, что элемент, который вы пытаетесь включить, не принадлежит вашему представлению.
Аналогично, объекты модели, как правило, должны быть просто POCO с минимальным количеством логики, связанной с ними.Заполнение их сервисами звучит как нарушение модели MVC.Как отмечает Джейсон, вы можете просто установить поставщиков формата для модели из кода контроллера.Тем не менее, я бы сказал, что еще лучше использовать провайдеры форматирования для генерации строк, которые вам понадобятся, и вместо этого поставить модель those
.
Ответ на комментарии к сообщению Джейсона
Подход 1 звучит как хорошая идея, так как кажется, что ваш контроллер становится сложным, и это хорошее место, чтобы разделить проблему на другой класс.Если вы внедрите сам Converter
в свой контроллер вместо того, чтобы использовать его в качестве статического класса, то его зависимости будут автоматически вставлены, когда Ninject создаст контроллер.
public class HomeController : Controller
{
[Inject]
public ViewModelConverter Converter { get; set; }
[Inject]
public MyModel Model { get; set; }
public ActionResult Index()
{
var modelResult = Model.GetStuff();
var viewModelResult = Converter.MakeViewModel(modelResult);
return View(viewModelResult);
}
public ActionResult About()
{
return View();
}
}
public class ViewModelConverter
{
[Inject]
public ILocalizationService LocalizationService { get; set; }
public ViewModel MakeViewModel(MyModel model)
{
// You should be able to use LocalizationService here
}
}
Я застрял с вашим основанным на свойствахвпрыск на это, хотя я лично предпочел бы использовать конструктор впрыск.