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

C# 无法理解此类(MS Graph的示例代码),c#,microsoft-graph-api,C#,Microsoft Graph Api,我最近开始使用MicrosoftGraph,作为它的一部分,OAuth。 我下载了一个官方的示例,看看他们在代码中做了什么,还有一个我真的无法理解的地方 public sealed class SampleAuthProvider : IAuthProvider { // Properties used to get and manage an access token. private string redirectUri = ConfigurationManager.AppS

我最近开始使用MicrosoftGraph,作为它的一部分,OAuth。 我下载了一个官方的示例,看看他们在代码中做了什么,还有一个我真的无法理解的地方

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;
        }
    }
}
在我看来,这个类是在自身内部实例化自己,我自己也不确定我现在说的是什么。 是否正在尝试暂时存储访问令牌。。。?如果是这样,实例化的意义是什么

是否正在尝试暂时存储访问令牌

在调用GetUserAccessTokenAsync方法之前,它不会存储访问令牌

TokenCache userTokenCache=新的SessionTokenCacheSignedUserId,httpContext.GetMsalCacheInstance;此代码显示,访问令牌将存储在SessionTokenCache中

如果是这样,实例化的意义是什么


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

首先,请注意构造函数是私有的。这意味着您不能自己实例化该类。那么你如何获得一个实例呢?嗯,有一个叫做Instance的属性,该属性在类本身内部实例化,在类内部构造函数是可访问的。实例属性是公共的,因此您可以访问它,并且它是静态的,因此只有一个实例属性

这个想法是,当你实例化其中一个东西时,需要执行一些特殊的逻辑,并且你的应用程序中通常只有一个实例。为了确保您遵循这一点,构造函数被设置为私有的,这样您就不能使用它来创建更多的实例,并且实例属性在那里,这样您就可以获得一个实例

所以,如果你尝试这个

IAuthProvider myAuthProvider = new SampleAuthProvider();    //error!
…它不会工作,因为构造函数是私有的

但是,如果你这样做

IAuthProvider myAuthProvider = SampleAuthProvider.Instance;    //ok!
var workerClass = new SomeClassThatNeedsAuth(SampleAuthProvider.Instance);
var workerClassToBeTested = new SomeClassThatNeedsAuth(new DummyAuthProviderForTests());
…那就行了。当然,您可能会争辩说,根本不需要将其分配给局部变量,因为您总是可以访问静态属性,但无论如何,这样做通常是一个好主意。例如,您可能有一个类需要它来完成其工作:

public class SomeClassThatNeedsAuth
{
    public SomeClassThatNeedsAuth(IAuthProvider authProvider)
    {
        _authProvider = authProvider;
    }

    private readonly IAuthProvider _authProvider;
}
这样做意味着在正常使用中你可以这样做

IAuthProvider myAuthProvider = SampleAuthProvider.Instance;    //ok!
var workerClass = new SomeClassThatNeedsAuth(SampleAuthProvider.Instance);
var workerClassToBeTested = new SomeClassThatNeedsAuth(new DummyAuthProviderForTests());
…但在测试中,你可以这样做

IAuthProvider myAuthProvider = SampleAuthProvider.Instance;    //ok!
var workerClass = new SomeClassThatNeedsAuth(SampleAuthProvider.Instance);
var workerClassToBeTested = new SomeClassThatNeedsAuth(new DummyAuthProviderForTests());

…现在,您的测试不必依赖于真实的身份验证提供程序,您可以使用虚拟提供程序来检查各种场景中发生的情况,而无需找出如何让真实提供程序执行这些操作。当然,您可以连接一些依赖项注入来为您实现这一点,这使它更加容易。

这是s的单例模式。整个程序只有一个实例。这个类只得到一个实例。在我们调用GetUserAccessTokenAsync方法之前,它不会存储访问令牌。感谢您回答我的问题并提供预期的好处!我还将介绍其他设计模式!谢谢