我最近开始使用Microsoft Graph,并且其中包括OAuth。 我下载了一个官方示例,并查看了它们在代码中的功能,而this part却是我真的听不懂的。
public sealed class SampleAuthProvider : IAuthProvider
{
// Properties used to get and manage an access token.
private string redirectUri = ConfigurationManager.AppSettings["ida:RedirectUri"];
private string appId = ConfigurationManager.AppSettings["ida:AppId"];
private string appSecret = ConfigurationManager.AppSettings["ida:AppSecret"];
private string scopes = ConfigurationManager.AppSettings["ida:GraphScopes"];
private SessionTokenCache tokenCache { get; set; }
private static readonly SampleAuthProvider instance = new SampleAuthProvider();
private SampleAuthProvider() { }
public static SampleAuthProvider Instance
{
get
{
return instance;
}
}
}
在我看来,该类正在自己内部进行实例化(我不确定自己现在在说什么)。 是否正在尝试暂时存储访问令牌...?如果是这样,实例化的重点是什么?
答案 0 :(得分:1)
这被称为单例模式。
首先,请注意,构造函数是私有的。这意味着您不能自己实例化该类。那么如何获得实例?好吧,有一个名为“实例”的属性,该属性在类本身内部实例化,可在其中访问构造函数。 Instance属性是公共的,因此您可以访问它,并且它是静态的,因此只有一个。
这个想法是,当实例化这些东西之一时,需要完成一些特殊的逻辑,并且通常应该在您的应用程序中只有一个实例。为确保遵循此规则,已将构造函数设为私有,以便您无法使用它来创建更多实例,并且那里有Instance属性,因此您可以持有一个。
所以,如果您尝试这样做...
IAuthProvider myAuthProvider = new SampleAuthProvider(); //error!
...它将不起作用,因为该构造函数是私有的。
但是,如果您这样做...
IAuthProvider myAuthProvider = SampleAuthProvider.Instance; //ok!
...那会很好。当然,您可能会争辩说根本不需要将其分配给局部变量,因为您始终可以只访问静态属性,但是无论如何通常这样做是一个好主意。例如,您可能有一个需要这样做的类:
public class SomeClassThatNeedsAuth
{
public SomeClassThatNeedsAuth(IAuthProvider authProvider)
{
_authProvider = authProvider;
}
private readonly IAuthProvider _authProvider;
}
以这种方式进行操作意味着您可以在正常使用情况下执行此操作...
var workerClass = new SomeClassThatNeedsAuth(SampleAuthProvider.Instance);
...但是在测试中,您可以这样做...
var workerClassToBeTested = new SomeClassThatNeedsAuth(new DummyAuthProviderForTests());
...现在您的测试不必依赖真实的身份验证提供程序,您可以使用虚拟实例来检查各种情况下发生的情况,而不必弄清楚如何使真实的实例进行这些操作。当然,您可以连接一些依赖项注入来为您执行此操作,这甚至变得更加容易。
答案 1 :(得分:0)
是否正在尝试临时存储访问令牌...?
在我们调用GetUserAccessTokenAsync
方法之前,它不会存储访问令牌。
TokenCache userTokenCache = new SessionTokenCache(signedInUserID, httpContext).GetMsalCacheInstance();
此代码表明,访问令牌将存储在SessionTokenCache
如果是的话,实例化的重点是什么...?
这只是整个程序中的一个实例,只是一个设计模式