2015-11-10 3 views
1

В моей странице мастер-макета, мне нужно, чтобы получить доступ к экземпляру 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 в базовый контроллер, но он немного выглядит сверху.

+1

просмотры не должны беспокоиться о таких вещах, как сеансовое управление и ядра Ninject. Вам лучше использовать «ViewModel» или переопределить свойство «Пользователь» с вашим пользовательским типом «IPrincipal», который предоставит необходимую информацию (http://stackoverflow.com/a/10524305). Что касается контроллеров, то да, инъекция 'SessionManager' в контроллер (или базовый контроллер) прекрасна. – haim770

+0

Спасибо за ваш ответ. Я согласен с тем, что Views не несет ответственности за это, но как здесь может помочь ViewModel? На самом деле это не представление - это главная страница, в которой просматривается слот. Невозможно заполнить виртуальную машину для каждого действия, чтобы позволить макету отображать тех, кто вошел в систему. –

+0

Вот почему я предложил второе решение – haim770

ответ

3

расширения Обычно Ninject MVC подключается к инфраструктуре MVC в Dependency распознавателя, и вы должны быть в состоянии решить свои услуги через него:

var sm = DependencyResolver.Current.GetService<SessionManager>(); 
+0

Это именно то, что мне нужно - спасибо. –

Смежные вопросы