如何在 ASP.NET MVC 5 中使用 Ninject 绑定 IAuthenticationManager?

15

我正在尝试使用Ninject绑定IAuthenticationManager,以便它可以被注入到我的AuthenticationService中。问题是我目前从ControllerHttpContext.GetOwinContext()中获取IAuthenticationManager,如下所示:

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

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

1个回答

32

我想通了。Ninject 直接提供了对 HttpContext 的访问,所以我这样做:

kernel.Bind<IAuthenticationManager>().ToMethod(
    c =>
        HttpContext.Current.GetOwinContext().Authentication).InRequestScope();

如果有人感兴趣,这里是答案。

@Meep 的更新

因此,Ninject不必与MVC位于同一项目中。出于这个目的,我将其提取到一个单独的项目中,我的情况下称为“X.Dependencies”。它引用了我需要实际设置绑定的所有其他项目、NuGet包等。它包含两个文件:原始的C#文件 Ninject 在添加时创建的文件,我将其重命名为NinjectConfiguration,以及一个名为AssemblyReferences的欺骗性文件,该文件需要使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独立成了一个名为“X.Owin”的项目,并包含了通常的Owin启动类,我只是将其重命名为OwinConfiguration

这两个项目都属于我的“域层”,其中还包括几个其他的辅助项目。列表中另一个值得注意的项目是我的“X.Mappings”,用于配置AutoMapper映射。它也使用WebActivator进行自初始化,因此我只需要在MVC项目中添加一个引用即可。

由于我已经从MVC项目中分离出了大量代码,因此它此时基本上只处理路由和视图渲染。所有其他内容都根据需要传递到辅助项目中。


GetOwinContext是来自Microsoft.Owin.Host.Systemweb nuget包的扩展方法。或者,您可以从HttpContext.Current.Items["owin.Environment"]获取上下文。 - Jon Bates
@Alex:你能从Global.asax中访问HttpContext.Current.GetOwinContext()吗? - janhartmann
@meep,我不知道,但可能是因为我将我的Ninject配置分离到另一个项目中,只有那个项目有正确的NuGet包和引用才能使它正常工作。我的MVC项目本身对Owin一无所知。 - Gup3rSuR4c
1
我很想看看您如何将ASP.NET Identity与MVC分离。 - janhartmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接