web-dev-qa-db-fra.com

Couche logique commerciale entièrement séparée de MVC

Nous refactons actuellement nos méthodes de contrôleur dans l'application ASP.NET MVC.

Au début, nous avons séparé la couche d'accès aux données (notre objectif était de supprimer entièrement Linq des contrôleurs). Nous pensons maintenant à une autre étape - comment créer une couche logique d'entreprise afin de réduire le nombre de lignes et de la logique dans le contrôleur. Actuellement, nous avons quelque chose comme ça:

public ActionResult CustomerProjects(some parameters)
{
    var collectionOfSomeType = this.CustomerRepository.GetSomeData();
    var anothercollection = this.ProjectsRepository.GetAnotherData(collectionOfSomeType);

    var viewModel = CreateSomeViewModel(anotherCollection);

    return View("Index", viewModel);
}

Bien sûr que ce n'est qu'un exemple avec quatre lignes de code. Nous avons des méthodes qui sont plus grandes (mais toujours imo pas si mal). Nous avons injecté nos classes d'assistance à travers le conteneur IOC, une logique plus complexe est assise là. Mais maintenant, nous aimerions éliminer même ces parties.

Vaut-elle la peine de créer une autre couche qui serait notre "dernière porte" avant les contrôleurs? Le résultat final serait:

public ActionResult CustomerProjects(some parameters)
{
    var viewModel = someSource.PrepareCustomerProjectsViewModel(params);

    return View("Index", viewModel);
}

Qu'est-ce que tu penses?

5
hugerth

Pour moi, il n'y a aucune question à répondre ici, vous devriez toujours s'efforcer de séparer vos composants autant que possible.

À un minimum nu, pour chaque nouveau projet, je crée, je fais exactement les étapes suivantes:

  • 1) Créer une solution Visual Studio vierge
  • 2) Ajouter un projet MVC à ce sujet
  • 3) Ajouter une bibliothèque de classe à elle appelée la couche d'entreprise
  • 4) Ajouter une banque de classe à elle appelé la couche de données

En faisant cela, vous suivez les bons principes de la conception de N-Tier. Ajoutez à cette forme d'AOP (par exemple, des attributs post-tranchant ou MVC) pour gérer tous les éléments qui transversent les couches et vous avez une bonne architecture solide à laquelle vous travaillez.

Aucune donnée RAW de votre couche de données ne doit jamais entrer dans votre couche de présentation (l'application MVC) tout doit être combinée et aplatie dans votre couche d'entreprise.

La couche d'entreprise ne devrait jamais traiter des objets DTO entre soi elle-même et la présentation, avec des données brutes qu'elle apporte à partir de la couche de données, puis applique diverses règles également spécifiques à votre domaine d'application.

Avec EF Code Premier, et Nu-Obtenez des packages tels que le mapper automatique, tout cela est incroyablement facile de nos jours.

Utilisez EF dans votre DAL pour obtenir vos données à l'aide de LINQ, ADO ou tout ce dont vous avez besoin.

Utilisez AUTOMA-MAPER pour transformer ces données en DTO pour être transmise à la couche Business, puis effectuez tout travail dont vous avez besoin avant de finalement utiliser AUTO-MAPER pour réussir la DTO résultant jusqu'à votre présentation.

Même si vous n'utilisez pas MVC, adopter cette stratégie est gagnant/victoire, même pour WPF, WebForms, Winforms et bien plus encore.

Si vous le faites correctement, la partie MVC devient essentiellement un affichage mort de cerveau de ce que la couche d'entreprise fait et la facilité avec laquelle vous pouvez supprimer votre application MVC et mettre une autre interface utilisateur sur sa place est effrayante.

Mise à jour 14/11/2014

Après avoir lu le commentaire le plus récent ajouté à ce fil, j'ai senti que l'ajout de cette partie supplémentaire à ma réponse était bien justifiée.

Une bonne architecture concerne beaucoup plus que de "jolis code".

Si vous avez tort de votre architecture, cela peut être la différence entre le crash et la brûlure et voler haut dans un flambeau de gloire.

Je fais un développement i.t et des logiciels dans une forme ou une autre maintenant depuis 1979 et croyez-moi, j'ai vu ma juste part d'échecs et de réussites à cette époque.

Lorsque j'ai commencé, et j'étais toujours mouillé derrière les oreilles, la programmation orientée objet n'était même pas une chose, vous avez tout grimpé dans un fichier source, puis vous l'avez rencontrée via un compilateur, puis un lien de lieur sans type d'interface graphique à T'aider.

Une partie du code que j'ai écrit pendant ces périodes était incroyablement désordonnée, inefficace et complètement horrible. Comme je l'ai grandi et que j'ai appris cependant, j'ai commencé à comprendre pourquoi ce type de code a causé les problèmes, et tout en écrivant de bonnes compétences faciles à lire, il est également très important de s'assurer que votre surface est également minimal et suit de bonnes normes.

J'ai vu tellement de grands projets échoue (ou à la moindre lutte très fort) au fil des ans et que chaque fois que cela a été à cause de mauvais choix fabriqués au niveau de la conception de l'architecture, je ne sais pas à quel point il est important d'obtenir La conception et les plans juste avant même de toucher une seule ligne de code.

Et pendant que je suis sur le sujet, les générateurs de code sont aussi dangereux. Si votre générateur de code crée un code des modèles que vous contrôlez, des armes géniales, mais si vous dépendez des modèles, où vous n'avez aucun contrôle sur la manière dont la sortie est générée, alors vous demandez des problèmes. Visual Studio est un excellent outil et incroyable pour créer des solutions rapides, mais assurez-vous de savoir exactement ce que cela crée dans les coulisses lorsque vous cliquez sur ce bouton pour faire quelque chose.

Si je reçois une bibliothèque pour développer, la dernière chose que je veux faire est de devoir approfondir les sources pour me dire comment cela fonctionne, je dépends de l'architecte qui l'a conçue pour me guider, en faisant des choix logiques, qui sont formés d'une connaissance de pratiques d'artisanat de logiciels solides.

Je ne voudrais tout simplement pas faire confiance à quelque chose qui a passé des cordes et des valeurs discrètes autour de ce qu'ils sont là où des bonbons lors d'une fête de Noël, car ... bien comment puis-je être sûr quel est le type et la responsabilité de la variable/de la propriété/la méthode.

Qui voudriez-vous avoir confiance davantage pour acheter une maison? Une entreprise professionnelle qui a embauché un architecte à sonder, planifier et concevoir un ensemble complet de plans, qu'une équipe professionnelle de constructeurs, de couvreurs, de plâtriers, etc., a ensuite travaillé comme une équipe à mettre en œuvre, ou le gars qui vit à la fin de votre rue qui travaille dans le commerce du bâtiment et connaît une chose ou deux sur la construction de maisons?

Je sais que mon choix serait.

8
shawty

C'est un vieux fil, mais j'aimerais ajouter la suite en faveur de l'ajout de la couche BusanceLogic ou de gestion:

  • Cela vous aidera à supprimer le code redondant comme la transformation de l'objet et à la vérification des règles requises.
  • Il rendra le code réutilisable et vous aidera sur des situations telles que: Vous devez fournir les mêmes données dans l'API Web et la méthode d'action avec vue ou autre application.
  • Il sera très utile que vous aimez appliquer la mise en cache de données à l'avenir.
  • Cela rendra votre code facile à tester.
1
Imran Javed

Ma responsabilité préférée par objet:

Controller gère le bâtiment du point de vue de la vue/ViewBag.

La logique sans rapport avec le rendu de la page est expédiée vers le BL.

Ainsi, personnellement, je composerais le point de vue dans le contrôleur et non créer une couche séparée. La couche que vous créeriez pour composer le point de vue, que l'appelleriez-vous? La couche de contrôleur?

0
Andrew Hoffman