9
votes

Est-ce une bonne pratique pour créer des composants de 3ème partie comme MS Enterprise Library ou Log4Net?

Ceci ressemble plus à une bonne question. Je souhaite proposer différentes bibliothèques génériques telles que la journalisation, la mise en cache, etc. Il existe de nombreuses bibliothèques tierces telles que MS Enterprise Bibliothèque, Log4net, NCache, etc..

Je voulais savoir si c'est une bonne pratique pour les utiliser directement ou créer un wrapper sur chaque service et utiliser un DI pour injecter ce service dans le code.

considère


0 commentaires

8 Réponses :


1
votes

Ceci est plus une question subjective, mais imo C'est une bonne chose d'envelopper toute utilisation spécifique d'application / bibliothèque dans une conception de modèle de service qui a bien pensé aux interfaces afin que vous puissiez facilement utiliser di et plus tard si vous devez passer à partir de Dites le bloc d'application de données ENTLIB à NHibernate Vous n'avez pas besoin de ré-architecte que vous êtes une application entière.


0 commentaires

0
votes

Je pense qu'il est préférable d'utiliser une enveloppe, personnellement, simplement parce que ce sont des choses que vous ne voulez pas courir lorsque vos tests d'unité sont exécutés (en supposant que vous testez également des tests unitaires).


0 commentaires

1
votes

Je crée généralement une classe "assistant" ou "service" qui peut être appelée statiquement pour envelopper des fonctionnalités communes de ces bibliothèques.

Je ne sais pas qu'il existe une énorme quantité de risque de référencer directement / les appeler, car ils sont définitivement des projets matures (au moins ENTLIB et LOG4NET), mais avoir un wrapper isole de la confusion de la version de la version, etc. Et vous donne plus d'options à l'avenir, à un coût assez faible.


0 commentaires

4
votes

Si vous souhaitez pouvoir échanger des implémentations de ces concepts, la création d'une enveloppe est la voie à suivre.

Pour la journalisation, il y a déjà quelque chose comme ça disponible commun.logging .


0 commentaires

8
votes

Ceci est subjectif, mais dépend aussi de la bibliothèque.

Par exemple, Log4Net ou NHibernate ont strictement API basé sur l'interface . Il n'y a pas besoin de les envelopper. Il existe d'autres bibliothèques qui permettront de tester vos classes si vous n'avez aucune interface entre les deux. Il peut être souhaitable d'écrire une interface propre.

Il est parfois bon de conseiller de ne laisser qu'une petite partie du code accède à l'API comme par exemple, Nibernate ou une bibliothèque d'interface graphique. (Remarque: Ceci n'est pas emballage, il s'agit de la construction des couches d'abstraction .) De l'autre côté, il n'a aucun sens de réduire l'accès aux appels de log4net, cela sera utilisé dans toute l'application.

Log4Net est probablement un bon exemple où l'emballage est juste surnombre. Certaines personnes souffrent de "wrappite", qui est anti-motif (parfois appelée "Enroulement laine en coton" ) et produit simplement plus de travail. Log4net a une API aussi simple et est hautement personnalisable, ils l'ont fait mieux que votre wrapper sera probablement.

Vous découvrirez que l'emballage d'une bibliothèque ne vous permettra pas de l'échanger avec un autre produit. La mise à niveau vers les versions plus récentes ne sera pas plus facile, plutôt que vous devez mettre à jour votre wrapper pour rien.


5 commentaires

Je conviendrais que Log4Net est une API très simple, mais il n'ya aucun moyen d'extraire toutes les interfaces de Log4net et de le donner aux développeurs afin qu'ils puissent coder utiliser uniquement des interfaces. Sans wrapper, il est très difficile de mettre à niveau la version de la bibliothèque spécifique s'il y a 100 ans d'application à l'aide. N 'y a-t-il pas une autre solution?


tangs: pas 100% pour cent sûr de ce que vous voulez dire. Lorsque vous utilisez LOG4NET, vous utilisez déjà des interfaces. Quand ils décident de le changer, il aura une raison, ils envisageront fortement de la compatibilité et ne le briseront que si cela vaut vraiment la peine. Si vous décidez d'utiliser cette nouvelle fonctionnalité ou cette nouvelle fonctionnalité qui a entraîné la modification de celle-ci, votre wrapper ne le supportera pas de toute façon et l'adaptation de votre enveloppe entraînera les mêmes changements. Il y a changements conceptuels et dépendances que vous ne pouvez pas "coder" en écrivant des emballages.


@stefan: Si vous décidez pas pour prendre en charge de nouvelles fonctionnalités, vous pouvez laisser votre emballage inchangé. Ou s'il y a une interface de rupture, vous changez peut être capable de le gérer dans votre emballage pour éviter de casser les 100 autres applications. Bien sûr, si vous souhaitez utiliser de nouvelles fonctionnalités, votre point est précis à 100% que vous ne pouvez pas les refuser.


@Tuzo: Si vous décidez de ne pas utiliser les nouvelles fonctionnalités, vous ne mettez pas à niveau vers la nouvelle version. S'il est possible de cartographier la nouvelle interface sur l'ancien, elle sera déjà disponible dans le produit, à moins que les personnes qui écrivent sont trop stupides. Donc, la chance que vous obteniez une intégration des changements de rupture gratuite est presque nulle, la chance que vous ayez plus de travail à chaque fois est presque cent pour cent. Les produits que je connais sont très bien attentionnés sur la compatibilité, car personne n'utiliserait ou la mettrait la mise à jour si elles ne le feraient pas et ce serait suicide.


+1 pour "wrappite". Googling ça soulève un seul résultat - cette page :)



2
votes

Utiliser des interfaces d'emballage effectuez effectivement des tests unitaires beaucoup plus facilement, mais ce qui est tout aussi important, il permet d'utiliser des simulacres.

comme exemple, Le cadre de Prism pour Silverlight et WPF définit une interface IloggerfaCade avec une méthode simple nommée journal . Utilisation de ce concept, voici comment je définis un enregistreur moqueur (en utilisant MOQ ) dans mes tests de mon unité : xxx

plus tard, vous pouvez passer loggermock.Object à l'objet testé via constructeur ou propriété ou configurer un injecteur de dépendance qui l'utilise.


1 commentaires

Je n'ai jamais vraiment compris cet argument car il est possible de se moquer de classes abstraites et concrètes ainsi que des interfaces. Je suis d'accord pour dire qu'il vaut mieux simuler des interfaces.



2
votes

On dirait que vous pensez à emballer la mise en œuvre de l'exploitation forestière et le partage avec des équipes différentes. Sur la base de ce voici quelques avantages et les inconvénients.

Avantages de emballage
  • Can interfaces abstraites à l'extérieur et dépendances de mise en œuvre. Cela donne une certaine protection contre les changements de rupture dans la bibliothèque de mise en œuvre.
  • Can rendre l'application plus facile et les normes Aligner les différents projets de la mises en œuvre.

    Inconvénients de l'emballage
    • Travaux de développement supplémentaire.
    • Documentation supplémentaire potentiel travail (comment utiliser la nouvelle bibliothèque).
    • Plus susceptibles d'avoir des bugs dans l'emballage le code de la bibliothèque mature. (Déploiement de votre corrections de bugs peut être un gros mal de tête!)
    • Les développeurs besoin d'apprendre la nouvelle bibliothèque (même si très simple).
    • peut parfois être difficile à envelopper toute une bibliothèque pour éviter la mise en œuvre des fuites interfaces. Ces types d'emballage les classes offrent généralement aucune valeur autre que l'obscurcissement. par exemple. MyDbCommand classe enveloppe une autre DbCommand classe.

      J'ai enveloppé une partie de Enterprise Library avant et je ne pense pas que beaucoup de valeur ajoutée. Je pense que vous seriez mieux:

      • Documenter les meilleures pratiques et l'utilisation
      • Fournir une implémentation de référence
      • Vérifier la conformité (revues de code etc.)


0 commentaires

0
votes

oui si être capable de remplacer la mise en œuvre est une exigence maintenant ou dans un avenir raisonnable.

non sinon.

Définition de l'interface que votre application utilisera pour tous les objectifs de journalisation / entrepreneur / ... est le travail de base ici. L'écriture de l'emballage est simplement un moyen de faire appliquer le compilateur de cette interface plutôt que de la mise en œuvre réelle.


0 commentaires