2012-06-27 16 views
5

Gegeben:Ninject und Dekorateure

public interface IBatchProcess 
{ 
    void Run(); 
} 

und mehrere Umsetzung:

public class BatchProcessOne : IBatchProcess { ... } 
public class BatchProcessTwo : IBatchProcess { ... } 
public class BatchProcessThree : IBatchProcess { ... } 

und ein Verfolgungs Dekorateur:

public class BatchProcessTraceDecorator : IBatchProcess 
{ 
    private readonly IBatchProcess _inner; 

    public BatchProcessTraceDecorator(IBatchProcess inner) 
    { 
     _inner = inner; 
    } 

    public void Run() 
    { 
     Trace.TraceInformation("Starting batch process..."); 
     _inner.Run(); 
     Trace.TraceInformation("Batch process complete."); 
    } 
} 

Wie kann ich den Dekorateur und all die Implementierungen binden so dass, wenn ich kernel.GetAll aufrufen ich 3 Instanzen der Ablaufverfolgung Dekorator, jeder mit einem anderen inneren Batch-Prozess?

Ich weiß über Ninject Interception und wollen keine Proxy-basierte Lösungen für diese aus verschiedenen Gründen verwenden. Momentan sieht es so aus, als müsste ich mit der Aktivierungsstrategie für IBatchProcess-Instanzen herumspielen, so dass sie aufgelöst werden und dann kann ich sie dekorieren und zurückgeben, aber ich hoffe, dass ich etwas in der verbindlichen API verpasst habe.

Antwort

3

Wenn Sie keine Abhängigkeiten in den Decorator injizieren müssen, gibt es eine sehr einfache Lösung für Ihr Problem. Verwenden Sie einfach die OnActivation-Bindungsmethoden. Das würde so aussehen

Bind<IBatchProcess>().To<ConcreteBatchProcess>() 
        .OnActivation((ctx, process) => 
         new BatchProcessDecorator(process)); 

Wenn Sie Sachen in den Dekorateur injizieren müssen, können Sie den gleichen Trick verwenden, aber den Dekorateur von

Bind<IBatchProcess>().To<ConcreteBatchProcess>() 
        .OnActivation((ctx, process) => 
         ctx.Kernel.Get<BatchProcessDecorator>(new ConstructorArgument("process", process))); 

Hoffnung zu lösen, die

hilft