Domanda

Ho configurato un pangrattato con il mvcsitemapprovverider. Ho una struttura che ha alcuni nodi statici e poi su alcune foglie ci sono nodi dinamici aggiunti utilizzando l'attributo ASP.NET.

[MvcSiteMapNode(DynamicNodeProvider = "Web.DealerNet.CommonFramework.UserDynamicNodeProvider)]
.

che 'funziona bene, ma quando guardi sotto il cofano, la prestazione è davvero molto negativa, perché all'avvio di tutti gli utenti vengono caricati nella memoria e per ogni utente è stato creato un nodo. Questo è l'approccio che è suggerito nel ufficiale DOCU .C'è un modo per usare il caricamento pigro qui?(Carica le proprietà dell'oggetto dell'utente quando è realmente chiamato e non creando un nodo per ogni utente ... Ho come utenti 20k in là ....)

public class UserDynamicNodeProvider : DynamicNodeProviderBase
    {
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
        {

            UserDao dao = DependencyResolver.Current.GetService<UserDao>();

            // Create a node for each element 
            foreach (User user in dao.GetAll())
            {   
                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Title = user.UserName;
                dynamicNode.Description = user.UserName;
                dynamicNode.RouteValues.Add("id", user.IdUser);
                dynamicNode.ParentKey = "TheParentKey";
                dynamicNode.Clickable = false;
                dynamicNode.Area = "MyArea";

                yield return dynamicNode;
            }

        }

    }
.

È stato utile?

Soluzione

Lay Loading non è attualmente supportato (anche se aggiungendo nodi a livello di richiesta è previsto per V5).

Per il momento, un elenco di utenti non suona come qualcosa dovrai indicizzare nei motori di ricerca (a meno che non ti capita di costruire un sito di social networking). Ogni utente non avrà bisogno di una voce separata nell'endpoint /SIteMap.xml. Pertanto, c'è poco valore nell'aggiungere un nodo per ogni utente.

Se questo è il caso, un approccio migliore è quello di utilizzare ConservatedRoutePameters per forzare tutte le richieste di abbinare un singolo nodo e quindi utilizzare Provider di visibilità e Sitemaptitleattribute Per regolare il modo in cui il menu e i soci del sito e sitemappat HTML vengono visualizzati.

[MvcSiteMapNode(Area="MyArea", PreservedRouteParameters="id", Clickable="False")]
.

E nell'azione del controller, impostare il titolo del nodo (o il suo nodo principale) all'utente corretto.

[SiteMapTitle("UserName")] 
public ViewResult Details(int id) { 
   UserDao dao = DependencyResolver.Current.GetService<UserDao>();

   // This example assumes your user model object has a public property "UserName"
   var user = dao.Find(id); 
   return View(user); 
}
.

Questo copierà l'ID su ogni richiesta per farlo corrispondere ad ogni richiesta, dando l'aspetto di un nodo per ogni utente nella pista del panecrumb. Di solito, è necessario utilizzare il filtroDitemapnodevisibilityProvider per nascondere questo nodo "Ghost" dal menu - Quando si utilizza questo approccio non è possibile elencare tutti gli utenti nel menu. Se hai bisogno di un elenco di tutti gli utenti, ti suggerirei di effettuare un elenco che carica invece direttamente dal database.

Vedere alcune demo scaricabili di questo sul post Come rendere mvcsitemapprovider ricordare la posizione dell'utente .

D'altra parte, se tu sono costruendo un sito di social networking, suggerirei Estendendo la cache Quindi cacciamo la cache al disco invece di mantenerlo tutto in memoria. Questo non migliorerà il tempo di avvio iniziale, ma ti terrà dall'utilizzare tutte le memoria del server. C'è un Apri file di file di origine e alcuni Istruzioni su come è possibile creare la tua impronta digitale disponibile online. Se stai attento a quanto spesso ricarica la cache, questo approccio potrebbe funzionare per te.

Un altro problema che potrebbe causare problemi di performance è il fatto che stai utilizzando dipendenzaResolver come un localizzatore di servizi (che è anti-pattern ). Supponendo che tu stia utilizzando Dire Esterno, iniettando le tue dipendenze attraverso il costruttore assicura che il tuo contenitore di contenitore (piuttosto che l'applicazione) sia in controllo sulla durata dei tuoi oggetti.

public class UserDynamicNodeProvider : DynamicNodeProviderBase
{
    private readonly UserDao userDao;

    public UserDynamicNodeProvider(UserDao userDao)
    {
        if (userDao == null)
            throw new ArgumentNullException("userDao");

        this.userDao = userDao;
    }

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        // Create a node for each element 
        foreach (User user in this.userDao.GetAll())
        {   
            DynamicNode dynamicNode = new DynamicNode();
            dynamicNode.Title = user.UserName;
            dynamicNode.Description = user.UserName;
            dynamicNode.RouteValues.Add("id", user.IdUser);
            dynamicNode.ParentKey = "TheParentKey";
            dynamicNode.Clickable = false;
            dynamicNode.Area = "MyArea";

            yield return dynamicNode;
        }
    }
}
.

Microsoft scoraggia l'uso della dipendenzaResolver.Current all'interno del tuo codice applicativo (vedere professionale ASP.NET MVC 4 , WOX Press, pagina 308 - Scritto da Jon Galloway, Phil Haack, Brad Wilson e K. Scott Allen) e facendo così strettamente vincola il tuo classe al quadro MVC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top