2017-03-15 1 views
0

j'ai plusieurs projets faisant référence à un emballage contenant interface génériqueRebind interface générique dans Ninject

public interface IHandler<T> where T : class 
{ 
    void Handle(T data); 
} 

Ces projets contiennent IHandler<> implémentations et les modules Ninject avec les fixations de l'interface de mise en oeuvre.

Je veux créer décorateur pour toutes IHandler<> implémentations

public class HandlerDecorator<T> : IHandler<T> where T : class 
{ 
    private readonly IHandler<T> decorated; 

    public HandlerDecorator(IHandler<T> decorated) 
    { 
     this.decorated = decorated; 
    } 

    public void Handle(T data) 
    { 
     // some logic 
    } 
} 

et décorer toutes les liaisons de IHandler<> enregistrées automatiquement. Par exemple. s'il existe une liaison de IHandler<string> et StringHandler, la cible doit être remplacée par new HandlerDecorator<string>(stringHandlerInstance).

Est-ce possible dans Ninject? Ou je devrais réécrire tout le code des modules Ninject?

Répondre

0

Étant donné que vous ne pouvez pas accéder à des informations de liaison significatives une fois les liaisons créées, il n'existe aucun moyen direct d'y parvenir. Vous pouvez cependant utiliser Ninject.Extensions.Conventions pour rechercher toutes les implémentations IHandler<T> et les lier/relier avec le décorateur. Dans Ninject, l'utilisation d'un décorateur nécessite une reliure pour le décorateur et une pour l'implémentation décorée. Dans le cas où vous utilisez toujours le même décorateur, il peut être simplifié en utilisant une liaison générique pour le décorateur. Ce serait:

kernel.Bind(typeof(IHandler<>)).To(typeof(HandlerDecorator)); 

(ou en utilisant Rebind au lieu de Bind - au besoin).

Et la liaison créée en utilisant l'extension des conventions doit être égale à:

kernel.Bind<IHandler<string>>() 
     .To<StringHandler>() 
     .WhenInjectedInto<HandlerDecorator<string>>(); 

Ceci est réalisé en faisant quelque chose le long des lignes de:

kernel.Bind(x => x 
    .FromThisAssembly() 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IHandler)) 
    .Excluding(typeof(HandlerDecorator<>)) 
    .BindDefaultInterface() 
    .Configure(b => b.WhenInjectedInto(typeof(HandlerDecorator<>)));