2017-03-15 1 views
0

ich mehrere Projekte haben ein Paket enthalten generische Schnittstelle ReferenzierungRebind generische Schnittstelle in Ninject

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

Diese Projekte enthalten IHandler<> Implementierungen und Ninject Module mit Bindungen von der Schnittstelle zu Implementierungen.

möchte ich Dekorateur für alle

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 
    } 
} 

IHandler<> Implementierungen erstellen und alle registrierten Bindungen von IHandler<> automatisch dekorieren. Z.B. Wenn eine Bindung von IHandler<string> und StringHandler vorhanden ist, sollte das Ziel auf new HandlerDecorator<string>(stringHandlerInstance) geändert werden.

Ist es in Ninject möglich? Oder ich sollte alle Ninject Module Code neu schreiben?

Antwort

0

Da Sie nach dem Erstellen der Bindungen nicht auf sinnvolle Bindungsinformationen zugreifen können, gibt es keine direkte Möglichkeit, dies zu erreichen. Sie können jedoch Ninject.Extensions.Conventions verwenden, um nach allen IHandler<T> Implementierungen zu suchen und sie mit dem Decorator zu binden/neu zu binden. In Ninject erfordert die Verwendung eines Decorators eine Bindung für den Decorator und eine für die dekorierte Implementierung. Wenn Sie immer denselben Dekorator verwenden, kann dies vereinfacht werden, indem eine generische Bindung für den Dekorator verwendet wird. Dies wäre:

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

(Oder mit Rebind statt Bind - je nach Bedarf).

Und die unter Verwendung der Konventionen Erweiterung erstellt Bindung sollte gleich:

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

Dies, indem Sie etwas entlang der Linien von erreicht:

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