2016-04-09 2 views
0

Dans la structure Onion, la couche externe peut accéder à toutes les couches internes. Si je passe par là, ma couche externe (qui est la couche d'interface utilisateur/contrôleur dans MVC) peut également accéder directement aux services d'application/d'entreprise et aux dépôts. Maintenant, mon contrôleur peut créer un modèle de domaine et le conserver dans le magasin de données en utilisant le référentiel. Et ainsi contourner la validation et d'autres règles métier écrites en couche de gestion. Je crois, il me manque quelque chose. S'il vous plaît aider.Oignon Framework: Doit-on accéder directement au référentiel UI/Controllers?

public SpeakerController(IConferenceRepository conferenceRepository, 
         IUserSession userSession, IClock clock) 
    : base(userSession) { 
    _conferenceRepository = conferenceRepository; 
    _clock = clock; 
    _userSession = userSession; } 

de http://jeffreypalermo.com/blog/the-onion-architecture-part-2/

Répondre

1

je dis "non", bien que Palerme a lui-même indiqué par ailleurs dans les conversations twitter. Je dis que chaque couche est autorisée à parler à la couche interne suivante et ne pas le contourner. L'exception que je fais à cette règle est si la fonctionnalité en question est simplement CRUD pour les données de référence. Je ne vois aucune raison d'introduire la complexité supplémentaire pour ce type de données. Une autre alternative consiste à faire en sorte que votre implémentation de référentiel applique la validation des règles métier. Puisque la mise en œuvre est sur la couche la plus externe de l'oignon, cela devrait être assez facile à faire.

J'ai trouvé le Hexagonal Architecture d'Alistair Cockburn éclairant et plus simple que l'architecture d'oignon. Fondamentalement, il y a "dans mon application" et "en dehors de mon application". Chaque fois que vous devez franchir cette limite, vous avez besoin d'un adaptateur pour protéger votre application des détails d'implémentation.

+0

Si je vous ai bien compris, vous voulez dire qu'il n'est pas nécessaire d'avoir des méthodes wrapper/pass-through en classe affaires pour l'opération CRUD. Il est correct d'utiliser des méthodes de référentiel dans l'interface utilisateur. Pour moi, la «validation des règles métier» dans le référentiel n'est pas une bonne idée. Cela va vaincre le but d'avoir une couche de gestion. – Pragmatic

+0

Il existe deux problèmes distincts: les données de référence et la validation. Je vais les traiter dans des commentaires séparés. Re: Données de référence Disons que j'ai une table appelée StateOrProvince. Il se peut que je n'ai pas de règles métier pour ces données autres que les champs obligatoires et l'unicité. Ces règles peuvent être appliquées par la base de données. Il n'y a pas d'autres opérations que CRUD pour ces données. Développer un modèle de domaine pour ce type de données peut être exagéré. Habituellement, je lie simplement ma vue directement à mon ORM dans ce cas. –

+0

Re: Validation Vous écrivez votre logique de validation dans votre couche de domaine. Vous devez avoir des abstractions qui représentent votre couche de persistance définie dans la couche de domaine que les objets de votre domaine peuvent utiliser. Il n'y a aucune raison pour que vous ne puissiez pas "invoquer" la logique de validation de votre objet de domaine dans l'implémentation de votre couche de persistance. En fait, si vous regardez attentivement le diagramme OA, l'implémentation de la persistance se trouve sur l'un des échelons les plus externes du diagramme. Cela signifie que vous obtenez le contexte complet du domaine dans votre couche de persistance. Vous pourriez aussi bien l'utiliser. –