В моей странице мастер-макета, мне нужно, чтобы получить доступ к экземпляру SessionManager просто показать, какой пользователь вошел в систему.Получить экземпляр объекта из Ninject изнутри _Layout.cshtml в MVC
У меня он работает следующим образом (_layout .cshtml):
@using Ninject
@{
var kernel = new StandardKernel();
var sm = kernel.Get<SessionManager>();
}
<!DOCTYPE html>
<html>
...
etc...
Затем дальше я использую экземпляр так:
<p>Logged in as @(sm.LoggedInUser.Name)</p>
Сейчас это работает, но это неопрятно? Могу ли я сделать это лучше? Можно ли создать экземпляр StandardKernel, как это (я предполагаю, что это синглтон)?
Я думал о том, что все контроллеры наследуются от базового контроллера и вводят SessionManager в базовый контроллер, но он немного выглядит сверху.
просмотры не должны беспокоиться о таких вещах, как сеансовое управление и ядра Ninject. Вам лучше использовать «ViewModel» или переопределить свойство «Пользователь» с вашим пользовательским типом «IPrincipal», который предоставит необходимую информацию (http://stackoverflow.com/a/10524305). Что касается контроллеров, то да, инъекция 'SessionManager' в контроллер (или базовый контроллер) прекрасна. – haim770
Спасибо за ваш ответ. Я согласен с тем, что Views не несет ответственности за это, но как здесь может помочь ViewModel? На самом деле это не представление - это главная страница, в которой просматривается слот. Невозможно заполнить виртуальную машину для каждого действия, чтобы позволить макету отображать тех, кто вошел в систему. –
Вот почему я предложил второе решение – haim770