2010-07-16 18 views
2

J'ai une classe publique, MainObject qui se trouve dans une bibliothèque de classes (dll), pour cet exemple nous l'appellerons BaseLibrary.Pouvez-vous accéder à un objet à travers deux couches d'assemblages?

J'ai une bibliothèque de classes de niveau supérieur qui fait référence à BaseLibrary pour accéder à ses membres. Nous appellerons ceci une DeviceLibrary. J'ai ensuite un Projet Windows Forms, DeviceControl, dans lequel j'ai ajouté une référence à DeviceLibrary.

Si j'ai besoin d'utiliser un objet MainObject, comment le faire? Je sais que je peux juste ajouter une deuxième référence dans le projet DeviceControl à la BaseLibrary mais je me demande simplement s'il existe un autre moyen d'y accéder via DeviceLibrary? Je ne suis pas sûr de ce que les lois de l'encapsulation dictent ici ...

Répondre

1

Tout type auquel vous faites référence dans votre code doit faire partie d'un ensemble référencé directement.

Bien que généralement pas pratique, vous pouvez utiliser le MainObject sans faire directement référence à lui en utilisant une référence System.Object à la place et en utilisant Reflection pour appeler ses membres. En C# 4.0, vous pouvez probablement utiliser le mot-clé dynamic:

dynamic x = MethodReturningAMainObject(); 
x.Foo(); //this will be compiled to use reflection to find "Foo" 

Outre l'utilisation d'une référence dynamique ou object, vous pouvez utiliser une classe de base exposée ou interface qui applique à MainObject.

+0

Vous pouvez utiliser dynamique, mais vous (presque certainement) ne voulez pas. – apollodude217

0

Avis de non-responsabilité: Ceci ne répond pas entièrement à votre question.

Typiquement dans une conception à N niveaux, les «modèles» couvrent toutes les couches. Voici un graphique que je référence lors de la conception: http://i.msdn.microsoft.com/cc700340.fig01_L(en-us).gif

Je ne suis pas sûr de ce que comprend votre BaseLibrary, mais il semble que vous deviez le référencer à partir de votre DeviceLibrary.

+0

Diagramme utile, avez-vous un lien vers le contexte d'origine qui vient? – Paolo

+0

@Paolo http://msdn.microsoft.com/fr-fr/magazine/cc700340.aspx –

1

Si vous êtes en mesure de modifier le contenu des assemblées de la bibliothèque (il est votre code), vous pouvez soit:

  1. Déplacer MainObject dans un ensemble de référence séparé et présenter l'une des références des ensembles existants il. Cela fonctionne bien si MainObject ne dépend pas réellement des autres contenus de BaseLibrary.

  2. Extrayez une interface de MainObject et placez que dans une bibliothèque de référence que tous les autres assembly peuvent référencer. Ensuite, vous codez l'interface, vous n'avez besoin que d'une référence à la nouvelle bibliothèque de référence.

Si vous ne pouvez pas modifier le contenu des assemblées de bibliothèque, vous pouvez recourir à l'écriture d'un objet wrapper pour MainObject, avec sa propre interface et extraire l'interface à une bibliothèque de référence comme dans l'option 2.

3

Vous avez pour ajouter la référence. Si vous ne le faites pas, le compilateur va se plaindre et vous dire d'ajouter la référence. L'utilisation de hacks de réflexion devrait être un deuxième choix très éloigné, elle rend simplement votre code lent et ne supprime toujours pas la dépendance à l'exécution de la DLL.