2009-01-16 14 views
2

Voici la configuration que j'ai dans une solution VS2008:VS2008 références circulaires (C#)

couche de données dans un projet nommé MyProject.Data

d'application Web dans un projet nommé MyProject.Web

MyProject .web a une référence à MyProject.Data

Dans MyProject.Web J'ai une classe que j'utilise appelé « MySite.Utils »

Je veux être en mesure de u se MySite.Utils dans MyProject.Data mais je ne peux pas parce que cela provoquerait une référence circulaire.

Une solution qui n'est pas possible est la création d'un troisième projet et le déplacement « MySite.Utils » là-bas parce que MySite.Utils utilise en fait MyProject.Data (donc il a besoin de faire référence et serait créé une autre référence circulaire)

Quelle est la meilleure façon de résoudre ce problème?

Répondre

11

Vous devez déplacer MySite.Utils à MyProject.Data par le son de celui-ci

0

Je crois que le SEULEMENT façon de résoudre ce problème serait de déplacer toutes les fonctionnalités liées entre elles dans un ensemble de sorte que il n'y a pas de références circulaires. Pardon. :(

peut-être penser à changer l'architecture en quelque sorte que ce ne soit pas nécessaire?

+0

WTF? Pourquoi la downvote? La réponse acceptée n'est-elle pas la même chose que ce que j'ai dit? –

+0

Je modifierais votre réponse pour dire «un». – MatthewMartin

4

La meilleure solution est de simplifier les choses ... par exemple, est que le code utilitaire données code utilitaire ou ui peut-être diviser en 2 dll, ce qui pourrait rendre les choses plus simples

Après cela, les interfaces sont une option raisonnable, mais vous pourriez avoir besoin d'un certain cadre de l'IoC pour fournir les implémentations. Par exemple, vous déclarez votre ICustomerRepository dans une référence asse mollement; tout fait référence à ça. Votre DAL implémente l'interface, mais le projet utils n'a plus besoin de référencer le DAL - juste l'assemblage de l'interface. Votre DAL peut maintenant référencer les utils - ou il pourrait juste savoir sur une autre interface IDataUtils (mieux pour le diviser de façon plus significative, bien sûr). La colle ici est le conteneur IoC, comme Castle Windsor.

Enfin, et ne le faites pas, mais même si l'EDI ne vous le permet pas, il est possible de créer des références circulaires dans .NET (via les outils de ligne de commande); c'est légal, mais il devient très salissant très rapidement, et il est difficile de réparer une construction cassée. N'y allez pas !!

2

Défaite couplage avec l'injection de dépendance.

Programmer vers une interface. MySite.Utils ne doit référencer aucun autre projet dans votre solution.

2

Toutes les classes qui référencent une autre solution dans Utils doivent être déplacées dans cette solution.

Questions connexes