Dépendance Circulaire Solution
De notre projet actuel a couru dans une circulaire problème de dépendance. Notre logique métier de l'assemblée est à l'aide de classes et de méthodes statiques de notre SharedLibrary de l'assemblée. Le SharedLibrary contient tout un tas de fonctions d'assistance, tels que SQL, la classe de Lecteur, les agents Recenseurs, des Variables Globales, gestion des Erreurs, de l'enregistrement et de la Validation.
La SharedLibrary besoins d'accès à l'Entreprise les objets, mais les objets d'Affaires ont besoin d'accéder à SharedLibrary. Les anciens développeurs de résoudre ce code évident odeur de reproduire la fonctionnalité de l'entreprise d'objets dans la bibliothèque partagée (très anti-SÈCHES). J'ai passé une journée maintenant essayer de lire sur mes options pour résoudre cela, mais je suis de frapper une impasse.
Je suis ouvert à l'idée de l'architecture de refonte, mais seulement comme un dernier recours. Alors, comment puis-je avoir Partagé Bibliothèque d'assistance qui peuvent accéder à l'entreprise les objets, avec les objets métier encore l'accès Partagé Bibliothèque d'aide?
Le SharedLibrary a un résumé global de la variable de classe rempli avec des propriétés statiques. Ces propriétés sont créés à partir des valeurs de la base de données d'où la nécessité pour les entreprises d'objets, ce n'est qu'un exemple parmi tant d'autres. Et bien sûr, les objets d'Affaires ont besoin d'accéder à ces constantes.
C'est pourquoi je n'ai jamais utiliser des termes vagues comme "partagé" pour décrire une bibliothèque. Que faut-il réellement faire? Ce que vous appelez une bibliothèque partagée a clairement beaucoup trop de responsabilités, et peut-être l'objet de gestion de bibliothèque n'trop. Généralement, ces solutions sont résolus en mettant le vraiment indépendant classes/interfaces dans leur propre bibliothèque.
OriginalL'auteur gfoley | 2010-04-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer un projet distinct seulement pour les objets de valeur (pas logique) et les interfaces.
Votre partagée de la bibliothèque de classes implémentent les interfaces, et la bibliothèque d'Affaires dépendent des interfaces (j'entends de plus testable et découplé code ici? Ne pas mentionner que vous retirez la dépendance de la Bibliothèque Partagée).
Idéalement, vous pourriez avoir des objets sur lesquels votre bibliothèque partagée dépendent de ce projet extra aussi. Si l'entreprise les objets sont trop complexes, vous pouvez aussi les transformer en interfaces.
Vous aurez à la fois des projets qui ne dépendent pas les uns sur les autres, mais seulement sur un autre projet avec seulement "factice" des objets (pas logique):
D'affaires ---> Interfaces et des objets de valeur <--- de la Bibliothèque Partagée
Maintenant ceux qui sont découplées =)
Si vous allez à aller loin pour architecte loin de la dépendance, pourquoi se contenter de 5 pieds avant la ligne d'arrivée, et pas seulement architecte loin de tout ça? À ce stade, vous auriez plus aucun code qui dépend de l'activité des entités et peuvent laisser la base d'un véritable partage de code dans le projet partagé. Ce qui serait ma réponse.
Ce n'est pas un énorme changement. Qui a besoin de quelques refactoring, mais pas de grand remaniement ou de la nécessité de remodeler les choses.
OK, donc je comprends le concept, mais j'ai du mal à comprendre comment la mettre en œuvre. Donc, si SharedLibrary Référencé BusinessObjects et les faire référence à la Couche d'Interface, alors je voudrais faire, par exemple: //sharedlibrary public abstract class MSSqlReader{ // méthodes } //la couche d'interface public interface IMSSqlReader {} //business object IMSSqlReader obj = new IMSSqlReader(); grossiers cela ne fonctionnera pas, obj n'ont pas accès à l'MSSqlReader. Comment peut-BusinessObject obtenir l'accès à des objets de la SharedLibrary l'utilisation d'interfaces?
Comme Chris l'a mentionné, ici, l'injection de dépendance est la clé. Vous ne devriez pas avoir besoin de nouvelles IMSSqlReaderImpl(), mais plutôt de le faire dans le constructeur et l'utiliser dans votre classe
OriginalL'auteur Samuel Carrijo
À tout moment vous avez un "partage" de la bibliothèque que vous devez absolument pas toujours la référence de votre entité commerciale du projet. Cela risquerait de provoquer ce problème de se produire que de toute évidence vous voir.
La solution à ce problème est de supprimer toutes les affaires de l'entité dépendante du code à partir de la bibliothèque partagée et soit rearchitect la nécessité de l'aide de code ou de l'endroit de l'aide du code à l'intérieur de l'entreprise de l'entité projet lui-même.
OriginalL'auteur Chris Marisic
Une solution serait de mettre une façade modèle entre les deux. Ici vous permettrait d'éviter l'accès direct/dépendance à votre entreprise les objets de la bibliothèque partagée. Au lieu de cela, vous seriez à l'aide d'une couche qui agit comme une façade entre votre lib et BOs. De cette façon, vous pouvez emballer vos bibliothèques partagées propre et découplées.
OriginalL'auteur bragboy