我尝试将IAuthenticationManager
与Ninject绑定,以便将其注入我的AuthenticationService
。问题是我目前从IAuthenticationManager
HttpContext.GetOwinContext()
获得了Controller
,如下所示:
private IAuthenticationManager AuthenticationManager {
get {
return this.HttpContext.GetOwinContext().Authentication;
}
}
如何使用Ninject创建绑定,以便它知道在运行时从IAuthenticationManager
查找HttpContext.GetOwinContext()
?可能吗?我的问题是否有意义?提前谢谢!
答案 0 :(得分:31)
所以,我明白了。 Ninject可以直接访问HttpContext
,所以我这样做了:
kernel.Bind<IAuthenticationManager>().ToMethod(
c =>
HttpContext.Current.GetOwinContext().Authentication).InRequestScope();
对于任何好奇的人来说,就是这样。
更新@Meep
因此,Ninject不必与MVC生活在同一个项目中。为了这个目的,我将它拉出到一个单独的项目中,在我的案例中称为&#34; X.Dependencies&#34;。它引用了我需要实际设置绑定的所有其他项目,NuGet包等。它包含两个文件,Ninject在添加时创建的原始C#文件,我已将其重命名为NinjectConfiguration
,以及一个名为AssemblyReferences
的cheaty文件,需要使Visual Studio实际将所有程序集导入到主要项目。这是代码:
/// <summary>
/// Cheaty way to force Visual Studio to find all assembly references, even the ones not directly used by the main project.
/// </summary>
internal static class AssemblyReferences {
internal static readonly Type t1 = typeof(Ninject.Web.Mvc.MvcModule);
}
现在,我想这可以避免,但到目前为止它对我有用。我虽然愿意接受建议。我只是从我的MVC项目中添加对它的引用,让WebActivator负责初始化它,就像它使用常规方式一样。
我也把Owin拉进了它的'&#39;自己的项目名为&#34; X.Owin&#34;它包含通常的Owin启动类,我只是将其重命名为OwinConfiguration
。
这两者都是我的&#34;域层&#34;的一部分。其中还包含一些其他帮助项目。列表中另一个值得注意的项目是我的&#34; X.Mappings&#34;用于配置AutoMapper映射。它还使用WebActivator进行自我初始化,所以我只是在MVC项目中添加对它的引用。
由于我已从MVC项目中提取了大量代码,因此此时所做的一切基本上都是路由和视图渲染。其他所有内容都会根据需要传递给帮助项目。