3 votes

Est-il permis dans Ninject d'avoir un IKernel injecté dans des endroits ?

Je suis actuellement en train d'apprendre Ninject et l'injection de dépendance et dans ma configuration actuelle, je passe IKernel dans des endroits afin que d'autres classes puissent instancier certaines classes ou obtenir des instances de fabrique.

Actuellement, mes fabriques sont liées en tant que singletons, et passer IKernel dans un objet puis faire _kernel.Get().CreateSomething() semble être un peu suspect et simplement transformer Ninject en un service locator glorifié.

Aussi, mes fabriques reçoivent IKernel afin qu'elles puissent résoudre l'implémentation liée de l'interface respective qu'elles créent.

Mes questions sont :

  1. Est-il permis que les fabriques fonctionnent de cette manière, ou la fabrique doit-elle simplement instancier le type concret elle-même ?

  2. Au lieu de passer IKernel partout, devrais-je préférer passer les fabriques / autres services par le constructeur ?

4voto

Simon Whitehead Points 27669

Je préfère ne pas le faire.. mais c'est juste mon avis.

Aussi, je ne crée pas mes propres factories.. j'utilise l'extension Factories de Ninject. Vous pouvez la trouver ici :

https://github.com/ninject/ninject.extensions.factory

En gros, vous créez vos bindings comme d'habitude, mais ensuite vous créez des interfaces pour les factories (en supposant WinForms ici) :

public interface IMainFormFactory {
    frmLogin CreateLoginForm();
    frmSettings CreateSettingsForm();
    IRepository CreateMainFormRepository();
}

..et liez-le avec l'extension ToFactory :

using Ninject.Factories; // je ne me souviens pas exactement de l'espace de noms pour le moment

public class FactoryModule : NinjectModule {
    protected override void Load() {
        Bind().ToFactory();
    }
}

L'extension factories n'a pas besoin que vous définissiez une implémentation concrète de cette interface.. elle sait déjà quoi faire avec ces objets en fonction des bindings que vous avez fournis (et instanciera toujours ce que vous n'avez pas défini de binding pour.. comme les formulaires. En coulisses, elle crée un gestionnaire qui implémente cette interface pour vous).

Alors, vous pouvez faire des choses comme cela :

private readonly IMainFormFactory _factory;

public frmMainForm(IMainFormFactory factory) {
    _factory = factory;
}

public void btnSettings_Click(object sender, EventArgs e) {
    // afficher le formulaire des paramètres..
    var settingsForm = _factory.CreateSettingsForm();
    settingsForm.ShowDialog();
}

..ensuite dans frmSettings, il y aura également une injection :

public frmSettings(ISettingsFormFactory factory) {
    // comme ci-dessus sauf pour ISettingsFactory
}

..c'est ainsi que je choisis de faire les choses. Peut-être que d'autres ont de meilleures idées (je serais intéressé à les entendre aussi!).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X