2010-09-09 5 views
1

Je suis une première fois écrire long lecteur de ce site.Comment charger à partir de la base de données une fois, puis utiliser des méthodes statiques pour récupérer des données?

Je crée un site .NET MVC en utilisant ProfilBase pour stocker un objet utilisateur personnalisé. La base de profil est stockée sur une base de données sur un autre serveur que le serveur Web. J'ai une classe d'aide, UserInfoHelper qui contient une méthode statique pour récupérer le nom d'utilisateur, email, téléphone, etc.

En ce moment, une méthode pour par exemple obtenir récupérer l'adresse e-mail ressemble à ceci:

public static String GetEmail() 
    { 
     ProfileBase profileBase = HttpContext.Current.Profile as ProfileBase; 
     UserObject user = (UserObject)profileBase.GetPropertyValue("UserObject"); 
     return user.PrimaryEmail; 
    } 

et de une vue je les appelle comme ceci:

<%= UserInfoHelper.GetEmail() %> 

donc, pour chaque fois que j'appelle une méthode dans la classe d'aide l'utilisateur est rapportez de la db. Je voudrais juste le récupérer une fois pour chaque utilisateur lorsqu'il est connecté ou au moins une fois par réponse. Quelle est la meilleure approche pour le faire?

Existe-t-il également un moyen facile d'obtenir le profil par défaut à l'aide de services Web au lieu d'appeler les procédures stockées directement?

Merci beaucoup à l'avance.

Répondre

1

Je pense que le problème est la façon dont vous utilisez MVC plus que tout. Vous utilisez un appel à une méthode d'assistance directement dans votre page Web. Plutôt que de le faire, vous devez transmettre ce traitement au contrôleur ou au code qui appelle (d'une manière ou d'une autre) et l'ajouter au modèle, puis utiliser <% = Model.Email%> dans la vue

avoir ce modèle mis en œuvre vous auriez déjà le traitement seulement faire l'appel une fois par demande. À ce stade, vous pouvez profiler votre application et voir si une optimisation supplémentaire est nécessaire. Les options qui s'offrent à vous sont ensuite d'envelopper la récupération de l'adresse e-mail dans une sorte de mise en cache qui pourrait persister entre les appels. Mais c'est seulement si cela est nécessaire - vous pourriez être en train de l'optimiser prématurément, car le fait de ne l'appeler qu'une seule fois par demande peut être acceptable.

2

Je peux d'accord avec ce que vient de répondre ... @ Paul

Utilisez des cas comme ceux-ci sont mieux traitées avec des actions de contrôleur qui renvoient une vue partielle dans laquelle vous souhaitez rendre les informations utilisateur. Vous enverriez une instance UserObject entière (ou une représentation ViewModel de celle-ci) à la vue et la View serait fortement typée à cette classe. Ensuite, si cela représente toujours un problème de performance, vous pouvez mettre en cache la sortie de l'action du contrôleur en utilisant les attributs OutputCache de l'action. C'est la manière préférée de faire les choses dans ASP.NET MVC.

Toutefois, si vous avez une page où vous avez besoin de beaucoup d'informations à travers différents objets de domaine d'entreprise, vous pouvez faire des classes composites Voir modèles comme ceci:

public class DashboardViewModel 
{ 
    public UserObject User { get; set; } 
    public BusinessData BizData { get; set; } 
    public FirmObject Firm { get; set; } 
} 

Dans votre page de vue, vous commencez avec cette ligne

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyNamespace.DashboardViewModel>" %> 

alors vous pouvez rendre quoi que ce soit de DashboardViewModel que vous avez envoyé à la page comme ceci:

<%: Model.User.Firstname %> 

ou

<%: Model.BizData.SalesTotal %> 

Je fais juste ce ici, mais ce qui est généralement la façon dont il devrait être fait.

+0

Ok, merci de votre réponse. Peut-être que je devrais le réfracter alors. La chose est que j'ai un contrôle utilisateur de connexion dans le coin supérieur droit qui montre des informations sur l'utilisateur lorsqu'il est connecté et j'ai aussi un contrôle sur la gauche qui montre plus d'informations utilisateur + theres informations sur certaines des vues dans le journal dans la zone. Donc, si je le fais de cette façon, il y aura au moins 3 fetchs pour les mêmes données. – user443239

+0

Je suppose que j'avais raison sur le fait que vous affichez les mêmes données sur plusieurs contrôles partiels. Vous n'avez pas besoin de trois récupérations. Vous allez chercher les données et préparer le modèle dans le contrôleur le plus général, le contrôleur qui tient tout ensemble, ce serait par exemple le contrôleur de page. – mare

Questions connexes