2016-07-18 8 views
3

Ich habe asp.net Core Rc2-Anwendung. Zum Speichern von Systemeinstellung verwende ich ioptions Mechanismus, der so konfiguriert ist:So manuell laden IOptions in ASP.NET Core RC2-Anwendung

services.AddOptions(); 
services.AddSingleton<IOptions<DocumentParameters>, DocumentParametersConfigureOptions>(); 

Alle Parameter aus der Datenbank in DocumentParametersConfigureOption Klasse geladen werden. Dank dieser Lösung können alle Systemeinstellungen einfach in die Controller/Dienste eingefügt und auf der Serverseite zwischengespeichert werden (sie werden nur beim Start der Anwendung geladen).

Ich habe auch eine Seite, wo Einstellungen geändert werden können (in der Datenbank geändert). Ich möchte sie neu laden, wenn der Benutzer auf Speichern klickt, ohne die Webanwendung neu zu starten.

+2

Die einfachste, die ich ist denken kann Ihre 'AddSingleton' zu' AddScoped' zu ändern. Das bedeutet aber, dass Sie die Datenbank einmal für jede Anfrage treffen würden, die Sie wahrscheinlich vermeiden möchten. Das Problem besteht darin, zu wissen, wann die Einstellungen neu geladen werden müssen, wenn die Änderung eintritt. Beachten Sie auch, dass Sie die Singleton-Instanz Ihrer Optionen NICHT ändern möchten, wenn sich die Webseite ändert, da dies dazu führen kann, dass einige Anforderungen fehlerhaft sind (wobei einige Einstellungen vor und nach der Änderung gelesen werden). –

+1

Anstatt alle Einstellungen beim Start zu laden Ich würde in Betracht ziehen, sie beim ersten Zugriff zu laden und dann zwischenzuspeichern, damit nachfolgende Anfragen nicht in die Datenbank gelangen. Wenn Sie die Einstellungen ändern, müssen Sie den Cache einfach löschen und die nächste Zugriffsanforderung für die Einstellungen füllt sie erneut aus der Datenbank. Es kann sich lohnen, in den 'IMemoryCache'-Dienst zu schauen, der mit' services.AddMemoryCache() 'in Ihrer' Startup'-Klasse injiziert werden kann. – Brad

Antwort

3

Verwenden Sie in memory caching.

Laden Sie Ihre Konfiguration unter Last dorthin. Auf schlüssigen Verbindungen/verrechnet, lesen Sie es von dort. Wenn Sie es über die Benutzeroberfläche aktualisieren, machen Sie einfach den Cache ungültig (d. H. Verwenden Sie das Stornierungs-Token, siehe Link von oben) oder legen Sie es einfach manuell zurück und überschreiben Sie den vorhandenen Wert.

+0

Ich denke, ich werde versuchen, dies mit Memory Caching-Sache. Vielen Dank – Ellbar

0

Ich würde einen zweiten Satz von IOptions erstellen und sie entweder AddTransient oder AddScoped injizieren.

Transiente Dienste werden bei jeder Anforderung erstellt, und die Dienste für den Bereich werden einmal pro Anforderung erstellt.

Here's a link zur Dokumentation der Lebensdauer.