2012-06-27 13 views
5

dado:Ninject y decoradores

public interface IBatchProcess 
{ 
    void Run(); 
} 

y múltiple aplicación de:

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

y un decorador trazado:

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."); 
    } 
} 

¿Cómo puedo enlazar el decorador y todas las implementaciones de modo que cuando llamo kernel.GetAll obtengo 3 instancias del decorador de rastreo, cada una con un proceso por lotes interno diferente.

Conozco Ninject Interception y no quiero usar soluciones basadas en proxy para esto por varias razones. Por el momento, parece que tengo que jugar con la estrategia de activación para las instancias de IBatchProcess, de modo que se resuelvan y luego pueda decorarlas y devolverlas, pero espero haber perdido algo en la API obligatoria.

Respuesta

3

Si no necesita inyectar dependencias al decorador, hay una solución muy simple a su problema. Simplemente use los métodos de enlace OnActivation. Que se vería como

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

Si necesita inyectar cosas en el decorador puede utilizar el mismo truco, pero resolver el decorador por

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

Espero que ayude