mardi 12 janvier 2016

Injecting a dictionary of factories with Ninject

I know how I can inject one or a collection of dependency interface instances into a class via constructor injection. However, in my current situation I have a bit different task.

I have several classes, and each of them has an associated "Processor" class. These processors are implementing the same IProcessor interface, and a common Processor class will process a collection of objects, using the appropriate processors for each of them. Creating a processor for a type can be expensive, so I'm using factories and instantiate the processor only when it's needed.

The code would look something like this.

public class Processor {

  private readonly Dictionary<Type, Func<IProcessor>> _processors;

  public Processor(IDictionary<Type, Func<IProcessor>> processors) {
    _processors = processors;
  }

  public void Process(IEnumerable items) {
    foreach (var item in items) {
      var processorFactory = _processors.GetValueOrDefault(item.GetType());
      if (processorFactory == null) continue; // for simplicity
      var processor = processorFactory();
      processor.Process(item);
    }
  }

}

How could I register the binding for this in Ninject? Or is there any kind of alternative patterns which are more "DI friendly"?

I would like to configure these "processor bindings" at application entry point level.

An alternative would be to have a static dictionary of processor factories in the Processor class, and register the bindings manually at the entry point, but I would like to avoid using static dependencies. Or would it be still better in this particular case?

Aucun commentaire:

Enregistrer un commentaire