2015-11-10 85 views
1

從Ninject對象實例在我的總體佈局頁,我需要訪問SessionManager實例僅僅是爲了顯示其用戶登錄。從內部_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'類型覆蓋'User'屬性,它將提供必要的信息(http://stackoverflow.com/a/10524305)。至於控制器,是的,將'SessionManager'注入控制器(或基本控制器)是好的。 – haim770

+0

感謝您的回覆。我同意Views不應該對此負責,但ViewModel如何在這裏提供幫助?這不是一個真正的視圖 - 它是一個查看插槽的主頁面。爲每個操作填充虛擬機是不可行的,只是爲了讓佈局顯示誰登錄。 –

+0

這就是爲什麼我建議第二個解決方案 – haim770

回答

3

通常NInject MVC擴展插入MVC的依賴解析器基礎設施,你應該能夠通過它來解決您的服務:

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

這正是我需要的 - 謝謝。 –