ASP.net MVC Contrôleur - Constructeur d'utilisation
Je suis en train de travailler sur un ASP.net l'application MVC et j'ai une question sur l'utilisation de constructeurs pour mes contrôleurs.
Je suis en utilisant Entity Framework et linq to entities pour l'ensemble de mes données de transactions. J'ai besoin d'accéder à mon modèle d'Entité pour presque toutes mes actions du contrôleur. Quand j'ai commencé l'écriture de l'application, j'ai été la création d'une entité de l'objet au début de chaque méthode d'Action, d'effectuer quel que soit le travail que je devais puis retour à mon résultat.
J'ai réalisé que j'étais en train de créer le même objet pour chaque méthode d'action, j'ai donc créé une variable membre privée de l'Entité objet et a commencé son instanciation dans le constructeur pour chaque contrôleur. Maintenant, chaque méthode, seules les références que variable membre privée pour faire ce travail.
Je suis encore de questions sur moi-même sur ce qui est droit. Je me demandais A.) quelle méthode est la plus appropriée? B.) dans le constructeur de la méthode, combien de temps sont ceux qui sont les objets de la vie? C.) existe-il des performances/de l'intégrité des problèmes avec la méthode constructeur?
Merci
- Avez-vous besoin de cet objet que pour un contrôleur?
- Peut-être vous devriez utiliser un singleton de crépitement avec salle d'instance statique et le chargement paresseux obtenir la propriété de l'instance.
Vous devez vous connecter pour publier un commentaire.
Vous poser les bonnes questions.
A. Ce n'est certainement pas approprié pour créer ce dépendances à l'intérieur de chaque méthode d'action. L'une des principales caractéristiques de la MVC est la capacité de séparer les préoccupations. Par le chargement de votre contrôleur avec ces dépendances, vous faites le contrôleur d'épaisseur. Ceux-ci devraient être injectés dans le contrôleur. Il existe diverses options pour l'injection de dépendance (DI). Généralement, ces types d'objets peuvent être soit injecté dans le constructeur ou dans une propriété. Ma préférence est constructeur d'injection.
B. La durée de vie de ces objets sera déterminé par le garbage collector. GC n'est pas déterministe. Donc, si vous avez des objets qui ont des connexions à des ressources limitées des services (connexions de base de données), alors vous pouvez avoir besoin pour vous assurer de fermer les connexions de votre auto (au lieu de compter sur les éliminer). De nombreuses fois la durée de vie des préoccupations sont séparés dans une inversion de contrôle (IOC) conteneur. Il ya beaucoup là-bas. Ma préférence est Ninject.
C. L'instanciation coûts sont probablement minimes. La base de données, le coût des transactions sont là où vous voudrez probablement de se concentrer votre attention. Il ya un concept appelé "unité de travail", vous pouvez l'examiner. Essentiellement, une base de données peut gérer des transactions plus que juste une sauvegarde/mise à jour de l'opération. L'augmentation de la taille de l'opération peut conduire à une meilleure db de rendement.
Espère que vous avez commencé.
Bob
RCravens a quelques excellentes idées. J'aimerais vous montrer comment vous pouvez mettre en œuvre ses suggestions.
Il serait bon de commencer par définir une interface pour l'accès aux données de la classe à mettre en œuvre:
Mettre en œuvre une classe de données. Entity Framework contextes ne sont pas chers à construire, et vous pouvez obtenir un comportement incohérent lorsque vous ne jetez pas d'eux, donc je trouve qu'il est généralement préférable d'extraire les données que vous voulez dans la mémoire, puis jetez-le contexte.
Maintenant votre contrôleur peut accepter qu'un seul de ces dépôts comme un argument du constructeur:
MVC vous permet d'utiliser votre propre Contrôleur d'Usine en lieu et place de celle par défaut, vous pouvez spécifier que votre Cio cadre comme Ninject décide de la manière dont les Contrôleurs sont créés. Vous pouvez configurer votre infrastructure d'injection de savoir que lorsque vous demandez une IPostRepository il doit créer une PostRepository objet.
Un grand avantage de cette approche est qu'il rend vos contrôleurs de l'unité-testable. Par exemple, si vous voulez vous assurer que votre modèle reçoit un Message quand il n'y a pas de postes, vous pouvez utiliser un moqueur cadre comme Moq pour définir un scénario où votre référentiel renvoie pas de postes:
Cela rend plus facile pour tester le comportement que vous attendez de vos actions de contrôleur, sans avoir besoin de configurer votre base de données ou quelque chose de spécial comme ça. L'unité des tests de ce genre sont faciles à écrire, déterministe (leur statut de réussite/échec est basé sur le code, pas le contenu de base de données), et rapide (vous pouvez souvent exécuter un millier de ces dans une seconde).
myRepository = new MyRepository()
.