public class StatisticsViewPresenter
{
private IStatisticsView view;
private Statistics statsModel;
public StatisticsViewPresenter(IStatisticsView view, Statistics statsModel)
{
this.view = view;
this.statsModel = statsModel;
}
}
Non faccio uso di eventi (ma sono disposto a se può risolvere il mio problema), quindi le mie classi di visualizzazione simile a questa:Come applicare l'iniezione delle dipendenze alle viste UserControl mantenendo al contempo la Designer?
public class StatisticsForm : Form, IStatisticsView
{
public StatisticsForm()
{
InitializeComponent();
}
[Inject]
public StatisticsViewPresenter Presenter
{
private get;
set;
}
}
Con
kernel.Bind<StatisticsPresenter>().ToSelf().InSingletonScope();
kernel.Bind<IStatisticsView>().To<StatisticsForm>();
kernel.Get<IStatisticsView>();
si accumula Form, crea il relatore, quindi inserisce il presentatore nella proprietà Presenter. È tutto peachy. (Ad eccezione di quel presentatore con ambito singleton - qualsiasi idea su un modo migliore per farlo? Forse semplicemente iniettare manualmente il presentatore nella proprietà Presenter della vista all'interno del costruttore del presentatore: this.view.Presenter = this).
Ma se trasformo StatisticsForm in StatisticsUserControl e lo trascino nel mio MainForm, non viene iniettato in MainForm da Ninject, semplicemente è stato creato da Designer. Vedo tre soluzioni qui:
1) Non utilizzare UserControls e utilizzare solo un modulo gigante che implementa queste viste multiple (eww);
2) Iniettare UserControls nel mio modulo e perdere il supporto di Designer;
3) La vostra soluzione! :)
Qual è stata la soluzione finale? Sto anche cercando un modo per utilizzare UserControls nella finestra di progettazione e utilizzare anche l'iniezione delle dipendenze. – Nathan
Fateci sapere se avete trovato una soluzione fattibile. Grazie! –
Fondamentalmente, ho utilizzato la finestra di progettazione per trascinare i controlli utente nel modulo e esposto questi controlli come proprietà del modulo. Quindi vicino al punto di ingresso dell'applicazione lego i valori di queste proprietà alla vista. Quindi, quando il contenitore (io uso Autofac ora) ha bisogno di un oggetto del tipo di vista (per il presentatore della vista), carica semplicemente il valore della proprietà della Forma. Nota a margine: utilizzo anche eventi e non esporre più il Presenter alla vista, per eliminare l'accoppiamento non necessario della vista al presentatore. La vista non dovrebbe sapere che c'è un presentatore. –