为什么我要根据上下文空检查UserManager实例

本文关键字:检查 UserManager 实例 上下文 我要 为什么 | 更新日期: 2023-09-27 18:09:13

我经常看到这段代码。

为什么有一个空检查_AppRoleManager?为什么不直接返回AppRoleManager呢?

public class BaseApiController : ApiController
{
    //Code removed from brevity
    private ApplicationRoleManager _AppRoleManager = null;
    protected ApplicationRoleManager AppRoleManager
    {
        get
        {
            return _AppRoleManager ?? Request.GetOwinContext().GetUserManager<ApplicationRoleManager>();
        }
    }
}

为什么我要根据上下文空检查UserManager实例

为什么要在这里返回_AppRoleManager(我假设这就是您想要的,缺少下划线只是一个打字错误)?显然,该属性可以返回两种可能的结果:其引用存储在私有字段中的对象和方法调用的结果。我们看不到其余的代码,但我能想到的一种可能的情况是,当您创建类的实例时,您可以将AppRoleManager类型的变量传递给构造函数并使用该变量实例化类的字段。如果没有任何东西要传递,那么就使用默认构造函数。在这种情况下,调用getter将导致返回一些默认的ApplicationRoleManager

null检查通常与默认模板ASP中的两个构造函数一起使用。. NET标识类(一个无参数,另一个通常采用管理器和登录管理器)。

例如,如果您没有使用构造函数或通过DI手动设置角色管理器,那么空检查将获得分配给该OWIN上下文的角色管理器。

在此代码中,Request.GetOwinContext().GetUserManager<ApplicationRoleManager>()ApplicationRoleManager的本地默认值(又称良好的本地默认值)。你可以设置ApplicationRoleManager,但如果你不这样做,对象将使用其本地默认值。换句话说,BaseApiControllerApplicationRoleManager有一个可选依赖

这个模式被称为属性注入模式。通过使用属性注入,你可以很容易地处理可选的依赖,而不是构造函数注入。有关更多信息,请参阅"是否有替代混蛋注射"问题。