web-dev-qa-db-fra.com

Mvc + 3 niveau; Où les menuisiers entrent en jeu?

Je concevons une application à 3 niveaux à l'aide de ASP.NET MVC 4. J'ai utilisé les ressources suivantes comme référence.

J'ai le suivant de Desingn jusqu'à présent.

Couche de présentation (PL) (Projet MVC principal, où [~ # ~ # ~] m [~ # ~] de [~ # ~] MVC [~ # ~] a été déplacé vers la couche d'accès aux données):

MyProjectName.Main
    Views/
    Controllers/
    ...

Couche logique commerciale (BLL):

MyProjectName.BLL
    ViewModels/
    ProjectServices/
    ...

Couche d'accès aux données (DAL):

MyProjectName.DAL
    Models/
    Repositories.EF/
    Repositories.Dapper/
    ...

Maintenant, PL Références BLL et BLL Références DAL. De cette façon, la couche inférieure ne dépend pas de celui qui est au-dessus.

Dans cette conception, pl invoque un service de la BLL. Pl peut passer un modèle de vue sur BLL et BLL peut passer un modèle de vue à Pl.

De plus, BLL invoque DAL COULEUR et DAL COULEUR peut renvoyer un modèle à BLL. BLL peut à son tour Construire un modèle de vue et le retourner à PL.

Jusqu'à présent, ce modèle travaillait pour moi. Cependant, j'ai rencontré un problème dans lequel certaines de mes mentions de vie nécessitent des jointures sur plusieurs entités. Dans l'approche MVC simple, dans le contrôleur, j'ai utilisé une requête LINQ pour faire joins, puis select new MyViewModel(){ ... }. Mais maintenant, dans le DAL, je n'ai pas accès à l'endroit où les menuisiers sont définis (dans la BLL).

Cela signifie que je ne peux pas faire de jointures à DAL et le retourner à BLL. Il semble que je dois faire des requêtes distinctes dans DAL (au lieu de jointures dans une requête) et BLL utiliserait alors le résultat de ceux-ci pour construire une vue de vue. Ceci est très gênant, mais je ne pense pas que je devrais exposer dal à viewmodels.

Des idées Comment je peux résoudre ce dilemme? Merci.

11
nomad

projet MVC principal, où M of MVC a été déplacé vers la couche d'accès aux données

Idée fausse commune. Le M de MVC n'a rien à voir avec les données, malgré les nombreux exemples et tutoriels qui le réclament.

M est votre point de vue et devrait résider dans votre projet MVC. Les menuisiers que vous avez dans votre BLL sont effectivement nommés Datacontracts ou Modèles d'affaires.

Dans votre contrôleur, vous avez quelque chose de comparable à ce sujet:

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

Dans votre service, quelque chose comme ceci:

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

Et dans le dataaccess, vous effectuez les jointures appropriées en fonction de l'objet demandé. Vous serez cependant bien sûr gratuitement d'ajouter des méthodes personnalisées à votre dataaccess si nécessaire, votre service peut donc appeler ces méthodes:

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
18
CodeCaster