asp.net-mvc – ASP.NET MVC身份默认实现

带有“个人用户帐户”的VS 2013中的默认Wep应用程序带有一个帐户控制器,其中包含以下代码: public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager ) { UserManager = userManager;

带有“个人用户帐户”的VS 2013中的默认Wep应用程序带有一个帐户控制器,其中包含以下代码:

public AccountController(ApplicationUserManager userManager,ApplicationSignInManager signInManager )
    {
        UserManager = userManager;
        SignInManager = signInManager;
    }

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

和Startup.Auth.cs中的这一行

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

我想了解什么机制将userManager参数传递给构造函数.我相信在这里使用dependendy注射模式.
如果我是正确的,我可以在Visual Studio解决方案中找到负责依赖注入的代码吗?

对于UserManager部分,我们为什么要测试_userManager是否为null,如果它已在控制器中设置的话?

解决方法

您已经找到了负责执行依赖注入的代码. app.CreatePerOwinContext()是用于在Owin管道中注册usermanager(创建用户管理器的委托)的代码,该管道实际上只是保存在HttpContext中的字典.

您可以在此blogpost中深入了解此机制的工作原理.

关于你完全理解的其他问题!如果注入依赖项,为什么要检查null?好吧:那是因为Owin在这里被用作穷人的DI机制,你在默认项目模板中看到的实际上是一个带有service locator anti pattern气味的回退机制.因为使用Owin而不是一个体面的DI容器,MVC管道需要一个默认构造函数,因此需要检查null和服务定位器. MVC如何决定使用哪个构造函数对我来说并不清楚.但我发现用户管理器有时会被注入,而在其他场景中则为null.可能是因为owin上下文大部分时间仅在创建Account控制器后可用.

虽然模板开箱即用,但它确实会让我的眉毛移动,就像移动你的模板一样.所以我带着一个像样的DI容器的干净实现,并删除了大部分owin服务定位器的东西.

如果您感兴趣,可以找到我使用Simple Injector的解决方案here.还有其他DI容器here的解决方案

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部