2015-12-11 4 views
2

Je développe une solution en couches utilisant WinForms, Visual Studio 2015, Entity Framework 6 et l'injection de dépendance sans conteneur tiers. À l'heure actuelle, j'ai une structure qui permet à l'interface utilisateur, BLL et DAL de ne pas avoir besoin de se référencer si je place les interfaces nécessaires pour effectuer le travail dans un projet partagé. Voir l'option A dans le diagramme ci-dessous:Où placer des interfaces dans un projet Visual Studio pour une solution en couches à l'aide de Dependency Injection

enter image description here

Les services BLL sont minces comme ils l'appellent essentiellement les mises en œuvre complètes dans le DAL (c.-à-BLL.GetDepts appelle DAL.GetDepts A l'origine, j'avais les interfaces définies dans. la BLL, comme indiqué dans l'option B. L'option B exigeait également que la couche LAL comprenne les interfaces, et que l'interface utilisateur devait également faire référence à la couche BLL. UI ou DAL donc il n'y avait pas de dépendance sur l'une ou l'autre couche Bien que l'option B ne dépende pas de toutes les couches, je commence à me demander si ce n'était pas une mauvaise idée. affectant le BLL tant que les couches de remplacement honorent l'interface exigences. Que j'utilise l'option A ou B, toute modification apportée à l'interface utilisateur ou à la couche d'accès direct nécessitera toujours un test avec la BLL. Donc, je commence à penser que faire des efforts pour que toutes les couches soient indépendantes les unes des autres n'était pas vraiment nécessaire ou pragmatique. La raison pour laquelle j'ai commencé à remettre en question mon passage à l'option A est parce que j'augmente le nombre de classes avec des interfaces pour étendre la fonctionnalité BLL, j'augmente également le nombre d'entrées d'interface dans la zone partagée. En regardant visuellement mon projet Visual Studio, je pense que toute couche qui a besoin de quelque chose de la BLL devrait trouver l'interface décrivant ce dont le BLL a besoin dans la couche BLL. C'est ce que l'option B a fait. Maintenant, avec l'option A, je dis que toute couche souhaitant implémenter quelque chose que la BLL doit regarder dans la section des interfaces BLL du projet partagé. Tout fonctionne pour l'instant mais je ne suis pas sûr que la poursuite de ce chemin va causer des problèmes. Donc, la question est, "Y a-t-il un problème avec l'option de poursuite A comme décrit ci-dessus?".

Répondre

2

L'emplacement des interfaces dépend de votre motivation à introduire des interfaces en premier lieu.

Si la motivation est de récolter les avantages du code faiblement couplé, il est préférable d'adhérer au SOLID principles. Spécifiquement, selon le Dependency Inversion Principle, "les clients [...] possèdent les interfaces abstraites" (APPP, chapitre 11).

Cela signifie qu'une interface doit être définie dans la même bibliothèque (projet assembly/Visual Studio) que le code utilise l'interface.

Ainsi, vous pouvez avoir des interfaces définies dans différentes bibliothèques, en fonction de l'utilisation. Vous n'avez pas besoin de mettre toutes les interfaces dans une seule bibliothèque.

+0

Merci Mark pour les informations et références. Principes, modèles et pratiques Agile en C# est maintenant un autre ajout Kindle à ma bibliothèque. – Robertcode

1

Je voudrais aller avec l'option B, car il semble être une implémentation décente du modèle MVC. Vous pouvez lire plusieurs articles que j'ai écrits sur le modèle MVC au here. L'avantage du MVC est la lisibilité. Si quelqu'un d'autre que vous-même peut maintenir le code, alors MVC va être familier, ou du moins facile à rechercher.