Dipendenza circolare nella radice della composizione

0

Ho un MDI MyMDIWinForm che ha bisogno di un'istanza di IGUIErrorHanlder per la gestione degli errori, Allo stesso tempo IGUIErrorHanlder dipende dalla MDI MyMDIWinForm per avere un posto dove lanciare pop-up e altre cose.

public class MyMDIWinForm 
{
   readonly IGUIErrorHanlder  GUIErrorHandler;
   public MyMDIWinForm(IGUIErrorHanlder guiErrorHandler)
   {
       GUIErrorHandler=guiErrorHandler;
   }

   public void DumbMethod()
   {
     try
     {
        //dumb code
     }
     catch(Exception e)
     {
         GUIErrorHandler.OnError(e.Message);
     }
   }

}

public FormGUIErrorHanlder:IGUIErrorHanlder
{
     readonly  Form Parent;
     public FormGUIErrorHanlder(Form form)
     {
         //this form should be the MDI form
         Parent=form;
     }

     public OnError(string message)
     {
          Parent.ShowDialog(new PopUpForm(message));
     }
}

Voglio che MyMDIWinForm abbia un'istanza di FormGUIErrorHanlder e che FormGUIErrorHanlder abbia la stessa istanza di MyMDIWinForm

Come faccio a rimuovere la dipendenza circolare?

Grazie mille

    
posta Badulake 19.06.2018 - 08:01
fonte

3 risposte

1

Non puoi semplicemente utilizzare delegazione ?

public class MyMDIWinForm 
{
   ...

   public void DumbMethod()
   {
     try
     {
        //dumb code
     }
     catch(Exception e)
     {
         GUIErrorHandler.OnError(this, e.Message);
     }
   }

}

public FormGUIErrorHanlder:IGUIErrorHanlder
{
     ...

     public OnError(Form parentForm, string message)
     {
          parentForm.ShowDialog(new PopUpForm(message));
     }
}
    
risposta data 19.06.2018 - 11:11
fonte
0

La soluzione semplice qui è di non avere l'iniezione del costruttore in FormGUIErrorHandler. Invece, avere un parametro aggiuntivo in OnError di tipo Form e passare il modulo dalla classe MyMDIWinForm.

La chiave qui è che la dipendenza che stavi cercando di modellare è in realtà troppo stretta. La classe FormGUIErrorHandler dovrebbe essere in grado di gestire qualsiasi modulo. Potresti anche voler considerare di avere un solo IGUIErrorHandler nella tua applicazione.

    
risposta data 19.06.2018 - 09:34
fonte
0

Ho finalmente risolto iniettando una fabbrica:

 public interface  IErrorGUIHandlerFactory
 {
        IErrorGUIHandler Create(Form form);
 }



public class MyMDIWinForm 
{
   readonly IErrorGUIHandlerFactory GUIErrorHandlerFactory;

   public MyMDIWinForm(IErrorGUIHandlerFactory guiErrorHandlerFact)
   {
       GUIErrorHandlerFactory=guiErrorHandlerFact;
   }

   public void DumbMethod()
   {
     try
     {
        //dumb code
     }
     catch(Exception e)
     {
         //use the factory passing Form as parameter
         GUIErrorHandlerFactory.Create(this).OnError(e.Message);
     }
   }

}
    
risposta data 19.06.2018 - 12:34
fonte