2016-12-13 14 views
1

古いMVC5 System.Webベースのスタックからいくつかのライブラリを.Netコアに移植しようとしています。私が抱えている問題の1つは、キャッシュの変更です。例えば、MVC5に私は国際化関連データを読み書きすることができました:.NETコアでのHttpContextとキャッシュ> = 1.0

[コードスニペット1]

public static Dictionary<string, IEnumerable<CoreDictionaryResource>> DictionaryResourcesCache { 
    get { return (Dictionary<string, IEnumerable<CoreDictionaryResource>>)HttpContext.Current.Cache(string.Concat(_Dictionary, DictionaryID, CultureID)); } 
    set { HttpContext.Current.Cache(string.Concat(_Dictionary, DictionaryID, CultureID)) = value; } 
} 

しかし、私は確実にSystem.WebこととそのHttpContextは、キャッシュのフィールドが含まれていません知らされています。私はCurrentフィールドを見ることができ、次にApplicationSessionのようなフィールドのホスト全体はCacheではありません。

私はStartup.csで必要な処理を行っており、アプリケーションはメモリキャッシュとセッションの両方を使用するように設定されています。私は、他のPOCOSが

[コードスニペット2]私が作成した拡張機能で

return System.Web.HttpContext.Current.Session.GetObject<User>("AuthenticatedUser"); 

GetObjectを使用して、キャッシュされていてセッションが動作していることを知っています。

は私がキャッシュから読み出しまたは多分私はhere,hereSO上を見るようにIDistributedCacheを使用する必要があるためにHttpContextを使用しようとし、誤ったツリーを吠えています。

しかし、実際に私はポートに[コードスニペット1]内の方法は...

あなたはキャッシングに関して新しい.NETのコアに与えることができ、任意のポインタは本当に参考になります。

ちょうど、私はコントローラやビューではロジックを望んでいません。私が構築しているアプリケーションは、データアクセスとロジックのために別々のDLLを使用していますので、DIの例をコントローラに投稿しないでください。この問題は、MVCスタックにヒットする前に、インフラストラクチャレベルで多く発生しています。

ありがとうございます。

+0

また、私たちのi18n文字列はXMLではなく個別のDBインスタンス内に格納されています...しかし、データアクセス層内のCRUDメソッドが正しく動作しているので、これは問題ではありません。私はちょうどこれらのサーバー側をキャッシュし、それらを読み出す方法を考え出す必要があります。 –

+0

しかし、起動時にメモリ(またはRedisのような分散キャッシュ)を 'services.AddMemoryCache();'で登録し、 'IDistributedCache'または' IMemoryCache'を解決してミドルウェアで解決することができます。 ASP.NETコアのIoC/DIの性質や反パターンに対して、静的フィールドは使用できません。または、ロジックをラップするクラスを作成します。または、データベースまたはメモリキャッシュをラップする新しいローカリゼーション機能を使用してください。 – Tseng

+0

参照:https://github.com/damienbod/AspNet5Localization/blob/master/AspNet5Localization/src/Localization.SqlLocalizer/DbStringLocalizer/SqlStringLocalizer.cs for SQLサーバーの例 – Tseng

答えて

4

ザ・を使用する必要がありますが、まだある、それだけで少し周りを移動しました。あなたはあなたに

"Microsoft.Extensions.Caching.Memory": "1.1.0" 

を追加した場合は、ファイルをproject.json、あなたのスタートアップに

 services.AddMemoryCache(); 

を追加します。ConfigureServicesメソッドを使用すると、以前のように動作するシングルトンメモリキャッシュインスタンスを設定できます。あなたは依存性注入を介してそれにアクセスするので、コンストラクタを持つコントローラはインスタンスを取得できます。

public class HomeController: Controller 
{ 
    private IMemoryCache _cache; 
    public HomeController(IMemoryCache cache) 
    { 
     _cache = cache; 
    } 

} 

次に、上記のクラスで_cacheを使用して、グローバルに利用可能なシングルトンクラスを取得できます。アウト・オブ・プロセス・ストレージ用のRedisキャッシュなど、他にも見たいかもしれない他の種類のキャッシュがあります。

0

あなたはそれがCacheクラスの1件のインスタンスがあり、MSDN https://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache(v=vs.110).aspx

からのHttpContext

を用いて露光されたが、キャッシュオブジェクトは、実際のAppDomainキャッシュオブジェクトだっただけのHttpContextようにメモリキャッシュを使用する必要がありますアプリケーションドメインごとにその結果、Cacheプロパティによって返されるCacheオブジェクトは、アプリケーションドメイン内のすべての要求のCacheオブジェクトになります。

我々はメモリキャッシュ機能で

using Microsoft.AspNetCore.Hosting; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Http; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Caching.Memory; 
using System; 
using Microsoft.Extensions.FileProviders; 

namespace CachingQuestion 
{ 
public class Startup 
{ 
    static string CACHE_KEY = "CacheKey"; 

    public void ConfigureServices(IServiceCollection services) 
    { 
     //enabling the in memory cache 
     services.AddMemoryCache(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     var fileProvider = new PhysicalFileProvider(env.ContentRootPath); 

     app.Run(async context => 
     { 
      //getting the cache object here 
      var cache = context.RequestServices.GetService<IMemoryCache>(); 
      var greeting = cache.Get(CACHE_KEY) as string; 


     }); 
    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
      var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 
} 
関連する問題