如何在ASP.NET MVC 5中将IAuthenticationManager与Ninject绑定?

时间:2014-03-23 02:56:15

标签: c# asp.net-mvc ninject asp.net-mvc-5 owin

我尝试将IAuthenticationManager与Ninject绑定,以便将其注入我的AuthenticationService。问题是我目前从IAuthenticationManager HttpContext.GetOwinContext()获得了Controller,如下所示:

private IAuthenticationManager AuthenticationManager {
    get {
        return this.HttpContext.GetOwinContext().Authentication;
    }
}

如何使用Ninject创建绑定,以便它知道在运行时从IAuthenticationManager查找HttpContext.GetOwinContext()?可能吗?我的问题是否有意义?提前谢谢!

1 个答案:

答案 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项目中提取了大量代码,因此此时所做的一切基本上都是路由和视图渲染。其他所有内容都会根据需要传递给帮助项目。