Ninject factory crée T basé sur enum

Je veux laisser Ninject résoudre une instance de T basée sur une valeur d’entrée enum spécifique.

J’ai lu sur l’extension d’usine de Ninject, mais je n’ai trouvé aucun exemple montrant que l’usine résolve une classe spécifique basée sur un enum.

Chaque classe dérive d’une classe de base et cette classe dérivée a plusieurs interfaces différentes que Ninject doit également résoudre.

Par exemple, voici à quoi l’interface devrait ressembler:

public interface IProcessFactory { T Create(ProcessIndex processIndex) where T : BaseProcess; } 

Comment cela peut il etre accompli ?

Ce n’est pas pris en charge hors de la boîte. Vous pouvez le personnaliser en écrivant votre propre implémentation de IInstanceProvider (voir aussi l’ entrée ninject Wiki . Ensuite, configurez-le pour votre usine spécifique:

 kernel.Bind() .ToFactory(() => new MyCustomInstanceProvider()); 

Ou bien, si vous souhaitez modifier le comportement de toutes les .ToFactory() : IInstanceProvider après le chargement de Ninject.Extensions.Factory :

 kernel.Rebind().To(); 

Toutefois, si ce n’est pas quelque chose dont vous avez besoin, j’envisagerais souvent d’écrire manuellement une racine de composition d’implémentation usine @.

Quoi qu’il en soit, dans les deux cas, vous devrez savoir comment créer une liaison conditionnelle. Ninject appelle cela la liaison contextuelle . Une méthode consiste à utiliser les métadonnées de liaison:

 const ssortingng EnumKey = "EnumKey"; Bind().To() .WithMetadata(EnumKey, MyEnum.A); IResolutionRoot.Get(x => x.Get(EnumKey) == MyEnum.A); 

Une autre façon serait de créer un IParameter personnalisé et de l’utiliser dans une liaison conditionnelle:

 Bind().To() .When(x => x.Parameters.OfType().Single().Value == A); 

Plusieurs options sont disponibles pour implémenter AbstractFactory en utilisant DI (Ninject).

Après avoir analysé les options, j’ai proposé la solution fournie par Mark Seemann, voir http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/

La solution Container Based Factory est celle que j’ai choisie, car:

  • Performances: résolution à la demande sur demande, aucune instance chargée dans le constructeur
  • Facile pour le refactor: lorsque nous voulons remplacer le framework DI actuel (Ninject) par un ensemble de fonctionnalités beaucoup plus performant (presque ou même mieux), les seuls appels à modifier sont les appels internes à l’usine et non dans NinjectModules / Composition Root.

Voir aussi sur SO: Simple Injector: Les classes d’usine devant créer des classes avec des dépendances