2008-12-12 10 views
3

Je suis à la recherche d'un bon modèle pour résoudre la référence circulaire suivante dans une application Windows Form:circulaire Référence

  • Assemblée 1 contient un formulaire Windows avec un élément de menu Infragistics « .Show » ing un formulaire dans Assemblée 2
  • Assemblée 2 contient un formulaire Windows avec un élément de menu Infragistics ".Show" ing un formulaire à l'Assemblée 1

le menu a généralement les mêmes éléments sur elle dans toute l'application. Donc, à la fois l'Assemblée 1 et l'Assemblée 2 ont des références l'une à l'autre pour "Rejoindre" les formes et les autres.

Une note sur la taille: Mon application est une application existante, donc la situation n'est pas aussi simple que la situation ci-dessus de deux assemblages. Mais si je peux résoudre le problème ci-dessus simplement (probablement pas en implémentant un, je peux l'appliquer à une application beaucoup plus grande (environ 20 composants, tous avec plusieurs formes qui apparaissent l'une l'autre sur les composants)

J'ai réfléchi quelques solutions, mais elles semblent toutes lourdes.)

Répondre

1

Utilisez une fabrique de composants ou un composeur de composants, tel que le MEF, pour créer des instances sans faire référence à l'assemblage source du composant.

4

Vous pouvez (dans les deux cas) faire en sorte que le bouton déclenche simplement un événement, le shell exe fait référence aux deux assemblages et relie le même pour montrer l'autre forme

Ainsi, le exe connaît à la fois;.. ni des formes connaît les autres

Par exemple (même concept):

using System; 
using System.Windows.Forms; 
class Form1 : Form 
{ 
    public event EventHandler Foo; 
    public Form1() 
    { 
     Button btn = new Button(); 
     btn.Click += delegate { if(Foo!=null) Foo(this, EventArgs.Empty);}; 
     Controls.Add(btn); 
    } 
} 
class Form2 : Form 
{ 
    public event EventHandler Bar; 
    public Form2() 
    { 
     Button btn = new Button(); 
     btn.Click += delegate { if (Bar!= null) Bar(this, EventArgs.Empty); }; 
     Controls.Add(btn); 
    } 
} 
static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     ShowForm1(); 
     Application.Run(); 
    } 
    static void ShowForm1() 
    { 
     Form1 f1 = new Form1(); 
     f1.Foo += delegate { ShowForm2(); }; 
     f1.Show(); 
    } 
    static void ShowForm2() 
    { 
     Form2 f2 = new Form2(); 
     f2.Bar += delegate { ShowForm1(); }; 
     f2.Show(); 
    } 
} 
+0

-1, car l'exécutable doit connaître la connexion entre ces deux fenêtres - utiliser des interfaces! –

+2

@BeowulfOF - c'est assez absurde. Il n'est pas raisonnable de mettre tout un cadre IoC/DI dans un exemple comme celui-ci! Et sans IoC/DI, l'exe doit connaître les types concrets pour les créer. Je suis vraiment très attristé ... –

+0

J'ai pensé utiliser des événements et j'ai même commencé à l'implémenter dans un petit cas. Je pourrais finir par utiliser cette solution. Cependant, cela semble assez lourd compte tenu du nombre d'assemblées et de formulaires que j'ai. Je suis à la recherche d'un moyen plus simple d'implémenter la solution sur l'ensemble de l'application, si possible. –

2

Avez-vous envisagé la création d'un 3ème assemblage et déplacer le code commun dans la 3ème Assemblée?

+0

Je ne suis pas sûr de suivre votre suggestion, John. Si je mets tous les "nouveaux ...show "appelle dans le 3ème assemblage, chaque assemblage doit le référencer et il fait référence à tous les autres, donc je suis toujours circulaire –

+0

Non, tout le code commun va dans le 3ème. Donc les deux autres dépendent du 3ème, et le 3ème ne dépend de rien –

0

Qu'en est-il de l'utilisation des Interfaces? Vous pouvez créer une troisième bibliothèque contenant des interfaces, et chaque fenêtre implémente une interface à partir de lui-même, et fait référence à l'interface de l'autre fenêtre.

+0

Je pense que les interfaces seront impliquées, mais j'ai encore besoin de créer une instance, donc mon code est quelque chose comme: IMyClass x = new MyClass(); Je suis en train de faire quelque chose avec la réflexion en ce moment, pour éliminer l'ensemble ref –

+0

Si vous avez besoin, IMyClass = new MyClass, alors vous avez définitivement besoin de surcharger votre modèle. = ObjectFromBaseClass.GetMyClassInstance. –

0

J'ai décidé, pour l'instant, d'utiliser la réflexion pour faire apparaître les fenêtres qui ont besoin d'apparaître. Je supprime le besoin de me référer directement à eux, et je vais pouvoir ajouter des composants plus facilement, sans créer tous les assemblages de références croisées.

J'ai regardé MEF mais, malheureusement, j'utilise VS2003, plutôt que VS2008. Cette suggestion m'a lancé sur la voie de la simple réflexion.

Merci.

Questions connexes