Asp.net mvc 从MVC中的_Layout.cshtml中的Ninject获取对象实例
在我的主布局页面中,我需要访问SessionManager实例,以显示登录的用户 我让它按如下方式工作(_Layout.cshtml):Asp.net mvc 从MVC中的_Layout.cshtml中的Ninject获取对象实例,asp.net-mvc,ninject,ninject.web.mvc,Asp.net Mvc,Ninject,Ninject.web.mvc,在我的主布局页面中,我需要访问SessionManager实例,以显示登录的用户 我让它按如下方式工作(_Layout.cshtml): @使用Ninject @{ var kernel=新的标准内核(); var sm=kernel.Get(); } ... 等 接下来我使用如下实例: <p>Logged in as @(sm.LoggedInUser.Name)</p> 以@身份登录(sm.LoggedInUser.Name) 现在可以了,但这不整洁吗?我可以用
@使用Ninject
@{
var kernel=新的标准内核();
var sm=kernel.Get();
}
...
等
接下来我使用如下实例:
<p>Logged in as @(sm.LoggedInUser.Name)</p>
以@身份登录(sm.LoggedInUser.Name)
现在可以了,但这不整洁吗?我可以用更好的方法吗?像这样创建一个StandardKernel实例可以吗(我假设它是单例的)
我曾考虑让所有控制器从基本控制器继承,并将SessionManager注入基本控制器,但这似乎有点过头了。通常,NInject MVC扩展插件插入MVC的依赖项解析程序基础结构,您应该能够通过它解析您的服务:
var sm = DependencyResolver.Current.GetService<SessionManager>();
var sm=dependencysolver.Current.GetService();
视图不应该关心诸如会话管理和Ninject内核之类的事情。您最好使用ViewModel
或使用自定义IPrincipal
类型覆盖User
属性,以提供必要的信息()。对于控制器,是的,将SessionManager
注入控制器(或基本控制器)是可以的。感谢您的回复。我同意视图不应该对此负责,但ViewModel在这方面有什么帮助呢?它不是一个真正的视图-它是一个母版页,可以查看插槽。仅仅为了让布局显示登录者而为每个操作填充VM是不可行的。这就是我建议第二种解决方案的原因
var sm = DependencyResolver.Current.GetService<SessionManager>();