2010-06-14 7 views
1

Je travaille sur un projet et je souhaite éventuellement utiliser un assemblage si disponible. Cet assemblage est seulement disponible sur WS 2008 R2, et mon produit idéal devrait être un binaire commun pour les deux ordinateurs avec et sans l'assemblage. Cependant, je développe principalement sur une machine de Windows 7, où je ne peux pas installer l'assemblée.
Comment puis-je organiser mon code pour que je puisse (avec un minimum de modifications) construire mon code sur une machine sans l'assemblage et deuxièmement, comment puis-je m'assurer que j'appelle les fonctions d'assemblage seulement quand il est présent.
(REMARQUE: La seule utilisation de l'assembly facultatif consiste à instancier une classe dans la bibliothèque et à appeler de façon répétée une fonction (unique) de la classe, ce qui renvoie un booléen L'assembly fsrmlib expose les opérations avancées de gestion du système de fichiers WS08R2.)
Je pense actuellement à écrire une classe wrapper, qui retournera toujours true si l'assembly n'est pas présent. Est-ce la bonne façon de faire cela?Comment organiser le code en utilisant une référence d'assembly optionnelle?

Répondre

3

Mon approche serait de charger dynamiquement l'ensemble, au lieu de coder en dur une référence. Votre code pourrait alors décider d'utiliser l'assembly (s'il est chargé) ou de renvoyer une autre valeur. Si vous utilisez l'assembly, vous devrez utiliser la réflexion pour instancier la classe et utiliser la méthode. De cette façon, votre code va construire et fonctionner sur n'importe quelle plate-forme, mais son comportement va changer s'il détecte la présence de fsrmlib.

La documentation System.Reflection.Assembly a la référence example code for doing this.

+0

Si je charge dynamiquement une référence, alors comment coder en utilisant la compilation de référence?Le compilateur devrait connaître l'existence de classes dans la référence. – apoorv020

+0

@ apoorv020, Mise à jour de ma réponse pour pointer vers un exemple de code. –

2

Masquer la fonctionnalité derrière une interface, disent:

public interface IFileSystemManager 
{ 
    void Manage(IFoo foo); 
} 

Créer deux implémentations:

  • Une mise en œuvre qui enveloppe la fonctionnalité souhaitée à partir fsrmlib
  • Une implémentation Null Object qui ne fait rien

Injecter le IFileSystemManager dans vos consommateurs en utilisant Constructor Injection:

public class Consumer 
{ 
    private readonly IFileSystemManager fileSystemManager; 

    public Consumer(IFileSystemManager fileSystemManager) 
    { 
     if (fileSystemManager == null) 
     { 
      throw new ArgumentNullException("fileSystemManager"); 
     } 

     this.fileSystemManager = fileSystemManager; 
    } 

    // Use the file system manager... 
    public void Bar() 
    { 
     this.fileSystemManager.Manage(someFoo); 
    } 
} 

Faites le choix de IFileSystemManager une option de configuration en déléguant la mise en correspondance de IFileSystemManager à la classe de béton dans le fichier de configuration de sorte que vous pouvez modifier la mise en œuvre sans recompiler l'application.

Configurez les applications s'exécutant sur WS 2008 R2 pour utiliser l'implémentation qui enveloppe fsrmlib et configurez toutes les autres applications pour utiliser l'implémentation Null Object.

Je vous recommande d'utiliser un conteneur DI pour la partie configuration au lieu de déployer cette fonctionnalité vous-même. Vous pouvez également envisager de traiter IFileSystemManager comme un complément et utiliser MEF pour le câbler pour vous.

+0

Mon approche actuelle est similaire à celle que vous avez décrite, le booléen que la fonction renvoie est utilisé pour décider si certaines actions doivent avoir lieu ou non (Donc, je retourne vrai chaque fois que FSRM n'est pas présent). En ce qui concerne l'utilisation des fichiers de configuration, j'espérais détecter la présence de la bibliothèque de façon dynamique. – apoorv020

Questions connexes