web-dev-qa-db-ja.com

ASP.NET Core 2.0のアプリケーション変数

ASP.NET Core 2.0でアプリケーション全体の変数を設定してアクセスするにはどうすればよいですか?

詳細:変数があります。データベースに存在し、文字通りすべてのページで使用されるCompanyNameと呼びましょう。 CompanyNameを表示する必要があるたびにデータベースにアクセスする必要はありません。 100年前は、Application["CompanyName']=CompanyNameしかし、これは.NET Coreで物事を行う方法ではないことを理解しています。代替手段は何でしょうか?

14

過去100年で多くの進歩がありました。しばらく前、私はASP.NET 1.0を信じていました、ASPクラシックのApplicationオブジェクトはcachingに置き換えられました(アプリケーションオブジェクトは残っていましたがASP classic)との後方互換性のために。

AspNetCoreには ASP.NETのキャッシュメカニズムを置き換えました があり、DIフレンドリーになっていますが、ASP.NETの状態は非常によく似ています。主な違いは、静的なHttpContext.Current.Cacheプロパティを使用する代わりに、注入する必要があることです。

起動時にキャッシュを登録...

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMemoryCache();
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvcWithDefaultRoute();
    }
}

そして、次のように注入できます...

public class HomeController : Controller
{
    private IMemoryCache _cache;

    public HomeController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

    public IActionResult Index()
    {
        string companyName = _cache[CacheKeys.CompanyName] as string;

        return View();
    }

次に、アプリケーション全体で機能させるために、 filter または middlewareを使用できます 何らかのキャッシュ更新パターンと組み合わせて:

  1. キャッシュから値を取得しようとしました
  2. 試行が失敗した場合
    • データベースからデータを検索する
    • キャッシュを再投入する
  3. 値を返す

public string GetCompanyName()
{
    string result;

    // Look for cache key.
    if (!_cache.TryGetValue(CacheKeys.CompanyName, out result))
    {
        // Key not in cache, so get data.
        result = // Lookup data from db

        // Set cache options.
        var cacheEntryOptions = new MemoryCacheEntryOptions()
            // Keep in cache for this time, reset time if accessed.
            .SetSlidingExpiration(TimeSpan.FromMinutes(60));

        // Save data in cache.
        _cache.Set(CacheKeys.CompanyName, result, cacheEntryOptions);
    }

    return result;
}

もちろん、それをクリーンアップして、コントローラーに挿入されるキャッシュのラッパーとして、厳密に型指定されたプロパティを持つサービスを作成することもできますが、それは一般的な考え方です。

また、Webサーバー間でデータを共有したい場合に distributed cache があることに注意してください。

代わりに、静的メソッドまたは静的に登録されたクラスインスタンスを使用することもできますが、IISでホスティングする場合は、静的がアプリケーションプールのリサイクル。そのため、同様の更新パターンを使用してデータを再入力する必要があります。

主な違いは、キャッシュを使用すると、データをキャッシュに保存する時間を最適化するために使用できるタイムアウト設定があることです(ハードタイムリミットまたはスライド式有効期限)。

12
NightOwl888

ApplicationWideSettingsと呼ばれるシングルトンクラスを作成できます。そのクラスにパブリックプロパティを与えます。必要なすべての値を一度初期化してから、クラスの唯一のインスタンスにアクセスして使用します:

ApplicationWideSettings.Instance.PropertyName;

ApplicationWideSettingsクラスの名前空間にアクセスするときに参照されることを確認してください。

グローバルに利用可能なすべてのデータを保存する1つのクラスがあるため、グローバル/静的設定よりもこの方法をお勧めします。

シングルトンとは何かわからない場合は、ジョンスキートのこの記事をご覧になることをお勧めします。

C#の詳細:C#でのシングルトンパターンの実装

5
Paul Weiland