ASP .NETコア-遅延オプションパターン


皆さん、こんにちは.
この記事では、私たちはどのように我々のアプリケーション内の設定を定義することができる方法を説明する方法を使用してIConfigureOptions<TOptions> インターフェイス.
私が開発中のアプリケーションでは、サイトマップを追加することを決めました.XMLファイルは、サイトマップを追加することを考える.XMLファイルは、適切なウェブサイトのリンクがよりインデックスされ、より効率的なSEOスコアを生成するように良い結果を与えるでしょう.後で、私が簡単にサイトマップを構成することができたパッケージがあったかどうかブラウズしている間.XMLとロボットTXTファイルは、アプリケーションに追加するには、私はパッケージの名前Winton.AspNetCore.Seo . このパッケージのおかげで、私はサイトマップを加えることができました.適切なURLを指定するだけで私のアプリケーションにXMLファイル.
そして、関連するパッケージのドキュメントを検討することで、関連サイトのURLを静的に見ることができました.XMLルート.一方、この操作を行う.
私は簡単なWebアプリケーションを作成し、私は必要な設定をインストールしてWinton.AspNetCore.Seo 関連するWebプロジェクトのパッケージ.まず、appsettingsを定義しました.JSONファイルを/sitemapに表示したいリンクを.XMLルート.同様に、ロボットの設定も可能である.txtファイルも.
{
  //...
  "Seo": {
    "Sitemap": {
      "Urls": [
        {
          "Priority": 1,
          "RelativeUrl": "/article/what-is-new-in-csharp"
        },
        {
          "Priority": 1,
          "RelativeUrl": "/article/dotnet-5"
        }
      ]
    },
    "RobotsTxt": {
      "AddSitemapUrl": true
    }
  },
  //...
}
  • それから私はConfigureServices 起動時のメソッド.csファイルは次のようになります.このようにして、関連するパッケージを使用するために必要な依存関係(依存関係登録)を定義するプロセスを適用しました.
  • public class Startup {
      //...
      private IConfiguration Configuration { get; }
    
      public void ConfigureServices(IServiceCollection services)
      {
        services.AddSeo(Configuration);
    
        services.AddSeoWithDefaultRobots(options =>
        {
          options.Urls = new List<SitemapUrlOptions>
          {
            new SitemapUrlOptions { Priority = 1, RelativeUrl = "/article/what-is-new-in-csharp" },
            new SitemapUrlOptions { Priority = 1, RelativeUrl = "/article/dotnet-5" }
          };
        });
      }
    
      //...
    }
    
  • その後、アプリケーションを実行し、/sitemapに移動したとき.XMLとロボットtxtのルートは、私は関連するリンクがAppSettingsで定義されて記載されていることがわかりました.JSON

  • 簡単な構成でこれらの操作を実行した後、私は実現したいシナリオに対処できます.
  • 私がこの点で達成したいことは、私のアプリケーションの関連リンクを返すサービスを呼ぶことによって関連リンクを得ることです、そして、/sitemapの関連リンクをリストすることです.XMLファイルは“オプションパターン”のおかげで検索エンジンがより適切なリンクをインデックスすることができます.
  • 私の心に浮かぶ最初のことは次のとおりですConfigureServices メソッドのアクセスIServiceProvider どういうわけか、関連するサービス(サービスを使用する)を解決することによって、そのサービスのメソッドを呼び出し、最終的にservices.AddSeoWithDefaultRobots(options => { … }) ) 私はこれらのリンクを私がメソッドを定義したオプションとして指定する必要がありました.
  • public class Startup {
      public void ConfigureServices(IServiceCollection services)
        {
            //...
    
            services.AddSeoWithDefaultRobots(  
                options =>
                {
                    var scopeFactory = services
                        .BuildServiceProvider()
                        .GetRequiredService<IServiceScopeFactory>();
    
                    using (var scope = scopeFactory.CreateScope())
                    {
                        var provider = scope.ServiceProvider;
                        using (var myService = provider.GetRequiredService<MyArticleService>())
                        {
                            options.Urls = myService.GetBlogPostLinksAsync().Result;
                        }
                    }
                });
    
            //...
        }
    }
    
  • この場合、関連する方法を検討すると、ConfigureServices コンテナに関連する依存関係を登録するための主な目的は、その定義のうち、不要なコードクラウディングを形成するメソッドです.この時点で、依存関係登録プロセスが終了した後に別の解決策を見つけ、関連するオプションを実行する必要がありました(言い換えれば、遅延構成(参照設定)).
  • その後、この問題について研究しながら、私はarticle アンドリューロックから.私が記事を詳しく調べたとき、私たちが実現したいシナリオが異なっていても、同じ状況(私たちは同じ結論に達しました)に遭遇しましたIConfigureOptions インターフェイス.このインターフェイスを検討したところ、私はそれが実現したいと思っていた状況を提供していました.つまり、私が欲しかったサービスを注入することで、私が指定したオプションの結果を簡単に定義することができました.そして、私は関連リファクタリングビジネスを始めました.
  • このため、まず最初にseoconfigurationというクラスを定義し、IConfigureOptions<SeoOptions> インターフェイスは次のとおりです.
  • 
    public class SeoConfiguration : IConfigureOptions<SeoOptions>
    {
      private readonly IArticleAppService _articleAppService;
    
      public SeoConfiguration(IArticleAppService articleAppService)
      {
        _articleAppService = articleAppService;
      }
    
      public void Configure(SeoOptions options)
      {
        var articleUrls = _articleAppService.GetArticleLinksAsync().Result;
        var urls = articleUrls.Select(url => new SitemapUrlOptions
        {
          Priority = 1, 
          RelativeUrl = url
        }).ToList();
    
        //ilgili değerlerin SeoOptions sınıfına aktarılması
        options.Sitemap.Urls = urls;
        options.RobotsTxt.AddSitemapUrl = true;
      }
    }
    
  • あなたがここで注意を払うならば、我々はIServiceProvider 関連する依存関係を解決し、解決する.我々は、単にコンストラクタの注入を行い、フレームワークは残りの世話をする.configureメソッドを調べると、適切なオプション(seooptions)をパラメータとして受け取ります.このメソッドでは、サービスから関連URLを受け取り、このオプションに値を割り当てます.このようにして、関連する設定を設定します.
  • 我々がする必要がある最後のことは、我々が作成したseoconfigurationクラスの延期された構成としてオプションの値が関連する依存登録プロセスの後にされるべきであると我々のアプリケーションに知らせることです.このため、我々は起動を更新することができます.csファイルは次のようになります.
  • public class Startup {
      //...
    
      public void ConfigureServices(IServiceCollection services) {
        //...
    
        services.AddSingleton<IConfigureOptions<SeoOptions>, SeoConfiguration>();           
        services.AddSeoWithDefaultRobots();
      }
    
      //...
    }
    
  • ここでは、「seooptionsクラスが使用される必要があるまで、関連する構成を延期してください、そして、それが使用されなければならないとき、私が定義したクラス(ここでは設定)の上で構成メソッドで実行される操作に従って関連構成を実行します).
    これで、アプリケーションを実行でき、/sitemapに移動して結果を確認できます.XMLとロボットtxtルート.

  • ご覧のように、我々は現在、関連するURLを動的に定義することで大きな負担から解放されます.加えて、IConfigureOptions インターフェイスでは、ConfigureServiceメソッドで定義する必要があるコードスニペットを削除します.
  • この記事を読んでくれてありがとうございました.次の記事でお会いしましょう.

    参考文献
  • https://andrewlock.net/access-services-inside-options-and-startup-using-configureoptions/
  • https://benjamincollins.com/blog/using-dependency-injection-while-configuring-services/