无法理解此类(MS Graph的示例代码)

时间:2018-10-10 07:17:48

标签: c# microsoft-graph

我最近开始使用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;
        }
    }
}

在我看来,该类正在自己内部进行实例化(我不确定自己现在在说什么)。 是否正在尝试暂时存储访问令牌...?如果是这样,实例化的重点是什么?

2 个答案:

答案 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

  

如果是的话,实例化的重点是什么...?

这只是整个程序中的一个实例,只是一个设计模式