3

J'ai récemment commencé à lire sur ASP.net MVC et après avoir excité au sujet du concept, j'ai commencé à migrer tout mon projet webform à MVC, mais je vais avoir un mal en gardant mon contrôleur maigre même après avoir suivi tous les bons conseils là-bas (ou peut-être que je ne comprends pas ...). Le site dont je me occupe a des articles, des vidéos, des citations ... et chacune de ces entités ont des catégories, des commentaires, des images qui peuvent être associés. J'utilise LINQ to SQL pour les opérations de base de données et pour chacune de ces entités, j'ai un dépôt, et pour chaque dépôt, je crée un service à utiliser dans le contrôleur.Architecting ASP.net MVC App utiliser des référentiels et services

donc j'ai -

  • ArticleRepository
  • ArticleCategoryRepository
  • ArticleCommentRepository

et le service correspondant

  • ArticleService
  • ArticleCatégorieService ...

vous voyez l'image. Le problème que j'ai est que j'ai un contrôleur pour l'article, la catégorie et le commentaire parce que je pensais qu'avoir ArticleController gérer tout cela pourrait avoir du sens, mais maintenant je dois passer tous les services nécessaires au constructeur du contrôleur. Donc, je voudrais savoir ce que je fais mal. Mes services ne sont-ils pas conçus correctement? devrais-je créer un service plus grand pour encapsuler des services plus petits et les utiliser dans mon contrôleur? ou devrais-je avoir un contrôleur de catégorie d'article et un contrôleur de commentaire d'article?

Une page vue par l'utilisateur est faite de tout cela, de l'article à voir, des commentaires qui y sont associés, d'une liste des catégories auxquelles elle s'applique ... comment puis-je répartir efficacement le contrôleur sur le garder "maigre" et résoudre mon mal de tête?

Merci! J'espère que ma question ne soit pas trop longue pour être lu ...

+0

Mes contrôleurs ont actuellement 6-10 + dépendances que je passe au constructeur. Cela entraîne également des contrôleurs volumineux, mais c'est simplement parce que je montre souvent beaucoup de données provenant de différentes sources au sein d'une seule page et toutes ces données doivent être chargées dans le modèle de vue. –

Répondre

7

Ceci est l'effet secondaire de suivre le modèle de responsabilité unique. Si chaque classe est conçue pour un seul but, alors vous allez vous retrouver avec beaucoup de classes. Ceci est une bonne chose . N'ayez pas peur de ça. Cela vous simplifiera la vie à long terme en ce qui concerne l'échange de composants et le débogage des composants de votre système qui ne fonctionnent pas.

Personnellement, je préfère mettre plus de ma logique de domaine dans les entités de domaine réelles (par exemple article.AddComment (commentaire) au lieu de articleCommentService.AddComment (article, commentaire)), mais votre approche est parfaitement bien aussi.

+0

Si j'affiche un article avec ses catégories-commentaires-images, dois-je les mettre tous dans un seul contrôleur pour que cela fonctionne? Comment faire face à un objet aussi complexe qu'un article? J'ai envie d'utiliser votre approche (les catégories et les commentaires font partie du domaine de l'article) pourrait m'aider à résoudre le problème tout en m'éloignant de la SRP ... – ak3nat0n

+0

Je voudrais avoir une classe d'article qui avait des propriétés pour ses catégories, Commentaires, Images , etc. Ceux-ci seraient paresseux chargés de manière à ne pas exiger de moi d'aller chercher le graphe d'objets entiers à partir de la base de données alors que je n'ai peut-être besoin que des métadonnées de l'article. Est-ce que ça répond à votre question? Je ne suis pas sûr de comprendre comment cela brise le SRP. SRP ne signifie pas que les entités liées ne peuvent pas se référencer mutuellement. –

+0

Vous avez raison, ils peuvent se référer les uns aux autres, je n'y ai pas pensé de cette façon. Je vous remercie! – ak3nat0n

2

Je pense que vous êtes dirigé dans la bonne direction. La question est de savoir comment instancier vos services? Je ne suis pas un gourou MVC.NET, mais j'ai fait beaucoup de projets Java orientés services et exactement le modèle dont vous parlez.

Dans la terre de Java nous généralement utiliser Spring pour injecter des haricots singleton.

1) Vous pouvez faire la même chose dans .NET, en utilisant des frameworks d'injection de dépendance.

2) Vous pouvez instancier des services si nécessaire dans la méthode, s'ils sont suffisamment légers.

3) Vous pouvez créer des membres de service statiques dans chaque contrôleur tant que vous les écrivez pour être threadsafe, afin de réduire le taux de désabonnement. C'est l'approche que j'utilise dans de nombreux cas.

4) Vous pouvez même créer une fabrique de services simple et globale à laquelle accèdent tous les contrôleurs, ce qui pourrait être simplement une classe de singletons.

Faites également un peu de googling sur l'injection de dépendance .NET.