2009-11-12 5 views
2

J'ai un composant de messagerie que j'intègre dans mon application, à la recherche de quelques conseils sur la façon de construire un wrapper autour de lui afin que je puisse l'échanger avec un autre 3e composant de fête si nécessaire.créer un wrapper autour d'un assemblage tiers - échanger et déconnecter

Ma bonne approche est maintenant:

  1. construire une interface la fonctionnalité je besoin.
  2. créer une classe qui implémente l'interface, en utilisant mon composant tiers dans cette classe.
  3. toute utilisation de ce composant sera via l'interface de manière analogue:

    ipop3 pop3 = new AcmeIncePop3Wrapper(); pop3.connect();

et à l'intérieur AcmeIncePop3Wrapper sera:

public void connect() 
    { 
     AcmeIncePop3 pop = new AcmeIncePop3(); 
     pop.connect(); 
    } 

Est-ce une bonne approche?

Je pourrais probablement ajouter une autre abstraction en utilisant ninject pour pouvoir échanger des implémentations, mais cela semble être tout ce dont j'ai besoin car je ne m'attends pas à changer tous les jours d'assemblées tierces, je ne veux pas rendre les choses si étroitement couplées.

Répondre

1

Je dirais que votre implémentation est bonne, c'est exactement ce que je ferais pour envelopper quelque chose.

1

Vous êtes sur la bonne voie. L'utilisation d'une interface ne résoudrait pas le problème, car vous ne pouvez pas ajouter l'interface à la définition à la classe dont vous avez besoin si elle se trouve dans un assembly tiers. Au lieu de cela, effectuez l'une des deux choses:

  1. créer une nouvelle classe entière avec méthodes communes à tous les différents assemblées que vous connaissez, et poignée chaque assemblage différent qui peut exister (logique supplémentaire pourrait être nécessaire ici pour gérer les différences majeures ).

  2. créer une interface avec communes méthodes, etc., puis créer une nouvelle classe qui hérite de la classe 3 partie et implémente l'interface . Pour ce faire, pour chaque classe dans nouveaux assemblages que vous devez utiliser.

Le problème avec l'option 2 est que vous ne pouvez pas étendre un sealed class, que je me attends à un tiers à faire. Je recommande l'option 1.

2

Je pense que vous avez une bonne implémentation. Fondamentalement, votre interface dit: «Voici comment je veux gérer les emails» et les composants tiers peuvent faire les choses différemment, mais si vous construisez vos classes wrapper en fonction de votre interface, vous devriez pouvoir travailler n'importe quel composant tiers dans cette interface.

La seule chose que vous voudrez peut-être faire attention est de savoir où vous êtes en train de compléter les classes concrètes.Vous pourriez envisager d'utiliser une usine ou quelque chose si vous êtes newing it up beaucoup - sinon il ne peut pas être un gros problème. Je pense juste que si vous créez un nouveau AcmeIncePop3() partout, il est encore assez étroitement couplé à cette classe concrète.

+0

bonne idée, je peux créer une méthode qui fait quelque chose comme: GetPop3Object(), donc je dois changer le code dans un endroit pour échanger des implémentations. – mrblah

+0

Ouais, c'est l'idée. Je ne suis pas vraiment sûr de la meilleure façon de le mettre en œuvre. Regardez dans le modèle Factory pour plus de détails. –

Questions connexes