Controller构造函数如何调用?

时间:2014-05-18 15:17:07

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

当我创建默认SPA模板时,VS2013会创建 MeController 。呼叫Get我有一个用户信息。但是,当我创建几乎相同的Controller,例如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;
    }

1 个答案:

答案 0 :(得分:0)

MeController中有一个默认构造函数,默认情况下会被调用。在这种情况下, UserManager 来自Owin,如下所示

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

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

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