Frage

Ich habe ein Breadcrumb mit dem MVCssitemProvider eingerichtet. Ich habe eine Struktur, die einige statische Knoten hat, und dann auf einigen Blättern gibt es dynamische Knoten, die mit dem ASP.NET-Attribut hinzugefügt werden.

generasacodicetagpre.

Das 'arbeitet' gut, aber wenn Sie unter die Kapuze schauen, ist die Leistung wirklich sehr schlecht, denn beim Start, da alle Benutzer in den Speicher geladen werden und für jeden Benutzer ein Knoten erstellt wird. Dies ist der Ansatz, der in der offizieller Docu .Gibt es eine Möglichkeit, hier ein Lazy-Laden zu verwenden?(Laden Sie die Eigenschaften des Benutzerobjekts, wenn es wirklich aufgerufen wird, und einen Knoten für jeden Benutzer nicht erstellen ... Ich habe wie 20k-Benutzer dort ....)

generasacodicetagpre.

War es hilfreich?

Lösung

Lazy-Loading ist derzeit nicht unterstützt (obwohl das Hinzufügen von Knoten von Anforderungsstufen für V5 geplant ist).

Im Laufe des Zeitpunkts klingt eine Liste von Benutzern nicht nach etwas, das Sie in Suchmaschinen indexieren müssen (es sei denn, Sie bauen eine Social Networking-Site). Jeder Benutzer benötigt keinen separaten Eintrag im Endpunkt /semap.xml. Daher gibt es wenig Wert beim Hinzufügen eines Knotens für jeden Benutzer.

Wenn dies der Fall ist, ist ein besserer Ansatz, Konservierungsrouteparameter zu verwenden, um alle Anforderungen an einen einzelnen Knoten zu zwingen, und verwenden Sie dann Sichtbarkeitsanbieter und sitemaptitleattribute , um die Art und Weise anzupassen, wie das Menü und Sitemappath HTML-Helfer angezeigt wird.

generasacodicetagpre. Stellen Sie in Ihrer Controller-Aktion den Titel des Knotens (oder dessen Übergeordnetenknoten) an den richtigen Benutzer ein.

generasacodicetagpre.

Hiermit wird die ID auf jeder Anforderung über die ID kopiert, um jeder Anforderung übereinstimmen, und ergibt dem Erscheinungsbild eines Knotens für jeden Benutzer in der Breadcrumb-Spur. In der Regel müssen Sie den FilteredSitemapnodeVisibilityProvider verwenden, um diesen "Ghost" -Knoten aus dem Menü auszublenden - wenn Sie diesen Ansatz verwenden, müssen Sie nicht alle Benutzer im Menü auflisten. Wenn Sie eine Liste aller Benutzer benötigen, würde ich vorschlagen, eine Liste zu erstellen, die stattdessen direkt aus der Datenbank geladen wird.

Siehe ein paar herunterladbare Demos davon auf dem Beitrag Wie man MVCssitemApprovider erstellt, erinnern Sie sich an die Position des Benutzers .

Andererseits, wenn Sie sind Bauen Sie eine soziale Netzwerkliste, würde ich auf Erweitern Sie den Cache , so dass es in der Festplatte speichert, anstatt alle im Speicher zu halten. Dies verbessert die anfängliche Startzeit nicht, behält Sie jedoch die Verwendung des gesamten Servers des Servers. Es gibt einen Open Source-Datei Cache und einige Anweisungen, wie Sie Ihre Implmentierung aufbauen können online verfügbar. Wenn Sie darauf achten, wie oft Sie den Cache neu laden, kann dieser Ansatz für Sie funktionieren.

Ein weiteres Problem, das Leistungsprobleme verursachen könnte, ist die Tatsache, dass Sie den Abhängigen Resolver als Service-Locator verwenden (was ist Anti-Muster ). Angenommen, Sie verwenden externe DI, um Ihre Abhängigkeiten durch den Konstruktor zu injizieren, sorgt dafür, dass Ihr DI-Container (anstelle der Anwendung) über die Lebensdauer Ihrer Objekte in der Kontrolle ist.

generasacodicetagpre.

Microsoft entmutigt die Verwendung von Abhängigkeitsresolver.Current innerhalb Ihres eigenen Anwendungscodes (siehe professionelle asp.net mvc 4 , WROX-Presse, Seite 308 - Geschrieben von Jon Galloway, Phil Haack, Brad Wilson und K. Scott Allen), und bindet also dicke Klasse zum MVC-Framework.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top