8
votes

Connexion dans les API

Lorsque j'écris une API assemblée pour quelqu'un d'autre à utiliser, il serait utile d'avoir une capacité de journalisation pour aider à diagnostiquer les problèmes des clients en l'utilisant.

Toutefois, si je me réfère, par exemple, log4net dans mon assembly, cela pourrait convertir avec la version de Log4Net utilisé par l'application du client.

Je ne veux pas réinventer la roue en écrivant mon propre cadre de journalisation.

Quelle est la meilleure façon de résoudre mon dilemme?

Edit: Je suppose que je puisse exiger que la version particulière de log4net que j'utilise soit installée dans le GAC pour éviter la conflit de la version avec le client, mais cela rendrait l'API une traction grasse qui nécessite une installation au lieu d'une goutte. En montage.


1 commentaires

Cette API ne sera pas lancée dans sa propre bibliothèque?


6 Réponses :


2
votes

Utilisez le Bibliothèque d'entreprise . Il est suffisamment flexible et utilise à la fois des enregistreurs intégrés et sa propre. Il a également été compatible assez de vérité. Il est assez configurable que s'il y avait un conflit avec un composant particulier, vous pouvez facilement l'échanger, avec des modifications de configuration seulement.


0 commentaires

1
votes

C'est là que l'injection de dépendance est votre ami - vous n'avez probablement pas besoin d'utiliser tous les logiciels, mais plutôt des petits morceaux de celui-ci. Donc, écrivez une classe Ilogger dans votre application qui expose votre fonctionnalité, puis écrivez une implémentation sur tout enregistreur que vous souhaitez utiliser. Par exemple, un enregistreur debug.Trace () est idéal pour le développement ou le débogage des travaux, tandis que vous pourriez avoir besoin d'un pilote Log4Net pour la production. Ensuite, utilisez une injection de dépendance, telle que StructureMap, pour insérer les instances de votre enregistreur dans le code de production.


0 commentaires

4
votes

Regardez comment Springframework résout ce problème. Il utilise Common.Logging qui peut ensuite être mappé sur Log4net ou à tout autre cadre de journalisation personnalisé via le fichier de configuration. Vous pouvez trouver plus de détails sur le site Web commun.logging mais vous effectuez essentiellement les éléments suivants:

  • référence common.logging dans votre classe d'utilisation, tout comme Log4Net Li>
  • Le consommateur de votre cadre configurera Common.Logging pour utiliser log4net comme: li> ul>

    p>

    p>

      <configSections>
        <sectionGroup name="common">
          <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
        </sectionGroup>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
    
      <common>
        <logging>
          <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
            <arg key="configType" value="INLINE" />
          </factoryAdapter>
        </logging>
      </common>
    
      <log4net>
    .... normal log4net configuration goes here...
      </log4net>
    
    • L'équipe commune.Logging pense avoir du mal à assurer une compatibilité rédaction des versions futures avec des versions antérieures. Par exemple 2.0 est entièrement binaire compatible avec 1,2. Li>
    • Common.Logging change moins fréquemment que Log4Net, au moins en théorie li> ul> p>


3 commentaires

Que se passe-t-il si le client n'utilise pas également.Logging ou utilise NHibernate ou Spring.Net. Cela ne pourrait-il pas introduire une possibilité d'un affrontement dans la version commune.logging.dll?


Les applications normales ne devraient jamais utiliser communes.Logging, seuls les cadres devraient. S'ils utilisent NH ou SF, le conflit est possible, bien que commun changements change moins fréquemment que Log4Net. Même si vous rencontrez dans ce numéro, vous faites une magie app.config pour permettre à l'application de charger deux versions différentes de la même DLL. Ou vous pouvez construire votre construction personnalisée de common.Logging sous un nom différent, je suppose.


En fait, mon mauvais, on dirait que NH utilise toujours Log4Net directement, de sorte que vos chances de conflits viennent d'abaisser!



0
votes

Utiliser l'injection de dépendance (unité, château Windsor, etc.) pour spécifier ce que la DLL log4net utilisera de cette manière si le client utilise une version plus ancienne, vous pouvez simplement brancher la version de log4net, si elles ne l'ont pas Ensuite, fournissez le vôtre.


0 commentaires

2
votes

Utiliser system.diagnostiques.trace . Aucune chance d'affrontements de version alors!


0 commentaires