6
votes

Comment appliquer une injection de dépendance aux vues d'UserControl tout en gardant des concepteurs heureux?

kernel.Bind<StatisticsPresenter>().ToSelf().InSingletonScope();
kernel.Bind<IStatisticsView>().To<StatisticsForm>();
kernel.Get<IStatisticsView>();

3 commentaires

Quelle était la solution éventuelle? Je cherche également un moyen d'utiliser UserControls dans le concepteur et d'utiliser une injection de dépendance.


S'il vous plaît laissez-nous savoir si vous avez trouvé une solution réalisable. Merci!


Fondamentalement, j'ai utilisé le concepteur pour faire glisser les commandes utilisateur sur le formulaire et exposé ces commandes sous forme de propriétés du formulaire. Ensuite, près de mon point d'entrée d'application, je lie les valeurs de ces propriétés à la vue. Ensuite, lorsque le conteneur (j'utilise Autofac maintenant) a besoin d'un objet du type de vue (pour le présentateur de la vue), il charge simplement la valeur de la propriété du formulaire. Note latérale: J'utilise également des événements et n'expose plus le présentateur à la vue, pour éliminer le couplage non incendu de la vue sur le présentateur. La vue ne devrait pas savoir qu'il existe un présentateur du tout.


3 Réponses :


2
votes

C'est certainement une zone intéressante de, dois-je dire, recherches. Nous nous sommes rendus une solution où nous organisons des contrôles utilisateur sur une forme générique.

Notre formulaire générique n'est pas destiné à être utilisé avec le concepteur. Par le code, nous ajoutons le contrôle de l'utilisateur choisi au formulaire de manière dynamique.

Pour d'autres cadres, vous devriez regarder Prism / Composite de le groupe Microsoft Stands & Pratics. Voici un article discuter des extensions pour WinForms.


0 commentaires

4
votes

Mon approche d'utilisation Ninject avec des formulaires, UserControls et le concepteur est:

  • Utilisez des usines pour créer les formulaires (également pour les UserControls si vous créez des contrôles Dinamiquement)
  • pour les usercontrols et les formulaires conservent les constructeurs sans paramètres et utilisent l'injection de propriété
  • Ajouter un Stratégie d'activation au noyau qui vérifie si Ninject vient de créer un formulaire ou un UserControl. Si tel est le cas, la stratégie d'activation itère sur les commandes de la propriété Controls de l'UserControl (ou du formulaire) et appelle Kernel.Inject (USERCONTROL) pour chaque USERCONTROL. (Une stratégie d'activation est un certain code Ninject exécuté après avoir injecté un objet)

    Vous pouvez utiliser le concepteur et avoir des formes et des utilisateurs avec des dépendances injectées via Ninject.

    Le seul inconvénient est que vous devez utiliser une injection de propriété au lieu de l'injection de constructeur pour les UserControls (et Les formulaires) xxx

    Créez le noyau et ajoutez la stratégie d'activation xxx

    extensions du noyau à itérer sur les contrôles des descendants xxx


0 commentaires

1
votes

J'ai récemment créé des usercontrols réutilisables code> avec le besoin de dépendances à injecter. Comme le conteneur ioc code> n'est pas utilisé pour créer ces usercontrol code> S, il ne peut évidemment pas injecter automatiquement les dépendances.

Ma solution est, une classe de base pour activer moins d'injection de propriété. L'injection de constructeur n'est pas prise en charge, car un constructeur sans paramètre est utilisé pour créer ces instances. P>

[Inject]
public IService Service { private get; set; }


1 commentaires

Notez que le cadre que j'ai utilisé pour implémenter cette solution est wpf , mais cela devrait fonctionner assez similaire à l'aide de Winforms