2016-12-13 3 views
1

Ich versuche, einige Bibliotheken aus dem alten MVC5 System.Web basierten Stack zu .Net Core zu portieren. Ein Problem, das ich habe, ist die Änderungen im Caching. Zum Beispiel in MVC5 konnte ich i18n bezogene Daten lesen und schreiben:HttpContext und Caching in .NET Core> = 1.0

[Codeschnipsel 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; } 
} 

Allerdings ist mir zuverlässig darüber informiert, dass System.Web und seine HttpContext kein Cache-Feld enthalten. Ich kann ein Current Feld und dann eine ganze Reihe von Feldern innerhalb dieser wie Application und Session aber leider keine Cache sehen.

Ich habe die notwendigen in Startup.cs getan und die App ist so konfiguriert, dass beide im Speicher Caching und Sitzungen verwendet werden. Ich weiß, dass die Sitzungen arbeiten, wie ich andere POCOs haben

[Code Snippet 2]

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

wo GetObject in einer Erweiterung zwischengespeicherten mit I erstellt.

Bin ich den Holzweg versucht HttpContext zu verwenden, aus dem Cache lesen oder vielleicht muss ich IDistributedCache verwenden, wie here,here und auf SO sehen.

Aber wirklich nur an Port I das Verfahren innerhalb von [Codeschnipsel 1] ...

Alle Zeiger Sie auf dem neuen Net-Core in Bezug auf Caching wäre wirklich hilfreich geben kann.

Nur FYI Ich möchte keine Logik in Controllern, noch in Ansichten. Die Anwendung, die ich erstelle, verwendet separate DLLs für den Datenzugriff und die Logik, also poste bitte keine Beispiele mit DI in den Controllern. Dieses Problem tritt eher auf einer Infrastrukturebene auf, bevor es den MVC-Stack erreicht.

Danke Jungs und Mädels.

+0

Außerdem werden unsere i18n-Zeichenfolgen nicht mit XML gespeichert, sondern in einer benutzerdefinierten DB-Instanz ... Dies sollte jedoch kein Problem darstellen, da die CRUD-Methoden innerhalb der Datenzugriffsebene ordnungsgemäß funktionieren. Ich muss nur herausfinden, wie man diese Server-Seite zwischenspeichert und sie ausliest. –

+0

Jetzt können Sie Speicher (oder verteilten Cache wie Redis) beim Start mit 'services.AddMemoryCache();' registrieren, dann 'IDistributedCache' oder 'IMemoryCache' auflösen und in Ihrer Middleware auflösen. Sie können nur statische Felder nicht verwenden, da dies gegen die IoC/DI-Natur von ASP.NET Core und ein Anti-Pattern ist. Oder Sie erstellen eine Klasse dafür, die die Logik umschließt. Oder verwenden Sie einfach die neue Lokalisierungsfunktion, die eine Datenbank oder einen Speichercache umgibt, – Tseng

+0

, siehe https://github.com/damienbod/AspNet5Localization/blob/master/AspNet5Localization/src/Localization.SqlLocalizer/DbStringLocalizer/SqlStringLocalizer.cs für sql Serverbeispiel – Tseng

Antwort

4

Die Funktionalität Cache-Speicher ist immer noch da, hat es nur um ein wenig verschoben. Wenn Sie

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

fügen Sie Datei project.json und die

 services.AddMemoryCache(); 

Sie Startup hinzufügen.ConfigureServices-Methode, haben Sie eine Singleton-Speicher-Cache-Instanz eingerichtet, die fast so funktioniert wie die alte. Sie gelangen über die Abhängigkeitsinjektion dorthin, sodass ein Controller mit einem Konstruktor eine Instanz abrufen kann.

Sie können dann _cache in der obigen Klasse verwenden, um zur global verfügbaren Singleton-Klasse zu gelangen. Es gibt auch andere Arten von Caches, die Sie ebenfalls betrachten sollten, einschließlich eines Redis-Caches für den Prozessspeicher.

0

Sie sollten die In Memory Cache verwenden nur als Httpcontext Cache-Objekt-Objekt tatsächlich Appdomain Cache war, obwohl es ausgesetzt ist, mit der Httpcontext

Vom Msdn https://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache(v=vs.110).aspx

Es eine Instanz der Cache-Klasse ist pro Anwendungsdomäne Daher ist das Cache-Objekt, das von der Cache-Eigenschaft zurückgegeben wird, das Cache-Objekt für alle Anforderungen in der Anwendungsdomäne.

sollten wir verwenden, um die

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(); 
    } 
} 
}