【问题标题】:How MeController constractor calls?Controller构造函数如何调用?
【发布时间】:2014-07-07 08:38:24
【问题描述】:

当我创建默认 SPA 模板时,VS2013 会创建 MeController。调用 Get 我有一个用户信息。但是当我创建几乎相同的控制器时,例如 UserController,并将所有从 Me 复制粘贴到 User 我没有关于方法中断点上用户的必要信息:

// GET api/Me
public GetViewModel Get()
{
    var user = UserManager.FindById(User.Identity.GetUserId());
    return new GetViewModel() { Hometown = user.Hometown };
}

我不懂这个魔法!我也没有看到 userManager 的构造函数的调用者和发送者。它在哪里?

public MeController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-identity


    【解决方案1】:

    MeController 中有一个默认构造函数,默认调用它。在这种情况下,UserManager 是从 Owin contect 获得的,如下所示

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

    即使您将其复制到像 UserController 这样的新类中,也应该会发生这种情况。您是否在使用任何 DI 库,例如 StrucuteMap/Unity 等?某些 DI 控制器选择“最贪婪”的构造函数(具有最大参数的构造函数)。您可以通过对该 DI 库使用适当的方法来覆盖它(例如,如果您使用的是 StructureMap,则为 this

    如果您想使用自己的 UserManager,您可以使用自己的 UserManager 实现并使用它。但是,如果您打算坚持使用默认值,则它已在 Startup.Auth.cs 中添加到 Owin 管道中。

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多