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
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.
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.
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
- 1. Comment organiser le code PHP?
- 2. Comment organiser javascript en utilisant CodeIgniter
- 3. Séparer le code à organiser
- 4. Comment organiser le code GUI (pour PyQt)?
- 5. Organiser en utilisant les directives
- 6. Organiser R Code source
- 7. Comment devrais-je organiser mon code SharePoint?
- 8. Organiser la liste d'images en utilisant css
- 9. Comment faire une liaison optionnelle dans Guice?
- 10. Comment ajouter une référence au code source d'une référence d'assembly?
- 11. RegEx et une chaîne optionnelle
- 12. Comment exécuter le code C# en utilisant le code C#?
- 13. Dynamiquement utilisant jQuery divs organiser
- 14. Comment créer une hiérarchie en utilisant le code HTML
- 15. organiser le code javascript basé sur la page
- 16. Validation optionnelle dans ASP.NET
- 17. Organiser une librairie python en plugins
- 18. Comment organiser une application Shoes Ruby?
- 19. Organiser le code, la disposition logique des fichiers segmentés
- 20. Comment faire correspondre une chaîne avec une pièce optionnelle?
- 21. Comment organiser le code d'accès à une base de données dans un projet Android?
- 22. Regex avec une partie optionnelle ne crée pas de référence arrière
- 23. Organiser le code python pour gérer les informations statistiques
- 24. Comment organiser le chargement de JS?
- 25. Organiser le cache d'adresse
- 26. Comment organiser les fichiers de code source Python?
- 27. En passant par référence et en utilisant la référence
- 28. Comment organiser le contrôleur dans une application Rails moyennement grande?
- 29. Ajouter une référence dans le code avec C#?
- 30. Expression régulière pour ignorer une virgule optionnelle
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
@ apoorv020, Mise à jour de ma réponse pour pointer vers un exemple de code. –