我经常看到这段代码。
为什么有一个空检查_AppRoleManager?为什么不直接返回AppRoleManager呢?
public class BaseApiController : ApiController
{
//Code removed from brevity
private ApplicationRoleManager _AppRoleManager = null;
protected ApplicationRoleManager AppRoleManager
{
get
{
return _AppRoleManager ?? Request.GetOwinContext().GetUserManager<ApplicationRoleManager>();
}
}
}
为什么要在这里返回_AppRoleManager
(我假设这就是您想要的,缺少下划线只是一个打字错误)?显然,该属性可以返回两种可能的结果:其引用存储在私有字段中的对象和方法调用的结果。我们看不到其余的代码,但我能想到的一种可能的情况是,当您创建类的实例时,您可以将AppRoleManager
类型的变量传递给构造函数并使用该变量实例化类的字段。如果没有任何东西要传递,那么就使用默认构造函数。在这种情况下,调用getter将导致返回一些默认的ApplicationRoleManager
。
null检查通常与默认模板ASP中的两个构造函数一起使用。. NET标识类(一个无参数,另一个通常采用管理器和登录管理器)。
例如,如果您没有使用构造函数或通过DI手动设置角色管理器,那么空检查将获得分配给该OWIN上下文的角色管理器。
在此代码中,Request.GetOwinContext().GetUserManager<ApplicationRoleManager>()
是ApplicationRoleManager
的本地默认值(又称良好的本地默认值)。你可以设置ApplicationRoleManager
,但如果你不这样做,对象将使用其本地默认值。换句话说,BaseApiController
对ApplicationRoleManager
有一个可选依赖。
这个模式被称为属性注入模式。通过使用属性注入,你可以很容易地处理可选的依赖,而不是构造函数注入。有关更多信息,请参阅"是否有替代混蛋注射"问题。