2

J'ai donc cette couche d'accès aux données, et je veux aussi me connecter à la base de données. Dans l'esprit de manger ma propre nourriture pour chien, je veux utiliser ma couche d'accès aux données pour faire la journalisation. Cependant, je veux également enregistrer l'accès aux données lui-même. Comme si:Anticipation possible de la situation de référence circulaire dans l'idée de projet .Net à venir ... quelque chose à surveiller?

App 
|| 
V 
Log 
|| 
V 
Data=>Log 

Est-ce que je risque d'entrer dans une boucle de rétroaction? Si oui, comment devrais-je l'éviter? Les références du projet pourraient-elles se chevaucher et causer des difficultés de construction? Comment avez-vous réussi à approcher ce modèle (anti?) Dans le passé?

+0

... Et quand vous aurez trouvé la boucle de dépendance, faites attention aux boucles infinies. –

Répondre

1

Créer un assemblage (ou des assemblages selon le cas) ne contenant que des interfaces. Référencez l'assembly d'interface uniquement à partir de vos assemblys de classe concrets et demandez à chaque classe concrète d'implémenter une ou plusieurs interfaces. Ne disposez pas d'assemblages de classes concrets pour d'autres assemblages de classes concrètes faisant partie de votre solution. Cette approche devrait vous aider à éviter les dépendances circulaires.

Implémentez un dependency injection/inversion of control container comme StructureMap ou l'une des nombreuses autres options .NET qui s'offrent à vous pour réduire davantage le couplage.

+0

Qu'en est-il de l'idée d'une boucle de rétroaction, par laquelle le DAL appelle Log qui appelle le DAL et ainsi de suite? –

+0

Je suggère que tous les messages de journal contiennent des informations sur le composant qui a créé le message. Introduisez ensuite un mécanisme configurable dans la couche d'accès direct pour contrôler quels composants doivent générer la journalisation, puis configurez la fonction de consignation comme l'un des composants qui ne doit pas générer de journaux dans la couche d'accès au journal. – Anton

+0

Je suis d'accord avec le commentaire ci-dessus, certains consommateurs de la DAL ne devraient pas causer la DAL pour se connecter. Peut-être diviser le DAL dans une interface qui inclut la journalisation (peut-être c'est l'injection par défaut), et une autre interface qui ne se connecte pas. L'interface qui enregistre, redirige l'appel réel vers le code d'accès aux données vers l'interface qui ne le fait pas. – stombeur

1

une solution peut-être simpliste:

public interface ILoggable { 
    string ToLogFormat(); 
} 

mettent ensuite en œuvre cette interface sur tout objet qui peut être connecté. La couche de journalisation ne dépend plus que de l'interface et peut être utilisée à n'importe quel niveau.

une alternative consiste à utiliser des classes 'helper' pour implémenter ToLogFormat via une surcharge, par ex.

public class LogHelper { 
    public string ToLogFormat(DAO obj) { ... } 
    public string ToLogFormat(SomeOtherClass obj) { ... } 
    ... 
} 

vous pouvez utiliser un assistant de journal monolithique (ce qui est mauvais, parce qu'il devrait faire référence à toutes les bibliothèques), mais une meilleure solution pourrait consister à mettre en œuvre des aides de journal pour chaque ensemble ou classe et indiquez le nom du journal -help classe utilisant un attribut personnalisé

personnellement, je préfère l'approche ILoggable comme étant plus flexible; votre paquet de journalisation pourrait avoir une fonction simple comme:

public class Logger { 
    public string ToLogFormat(object obj) { 
     if (obj is ILoggable) { 
      return ((ILoggable)obj).ToLogFormat(); 
     } 
     return obj.ToString(); 
    } 
}