Как можно использовать существующий экземпляр для выбора типа для создания в контейнере IoC

это, вероятно, вопрос новичка, но у меня есть следующее:

public class FooSettings {}
public class BarSettings {}
public class DohSettings {}
// There might be many more settings types...

public interface IProcessor { ... }

public class FooProcessor
    : IProcessor
{
     public FooProcessor(FooSettings) { ... }
}

public class BarProcessor
    : IProcessor
{
     public BarProcessor(BarSettings) { ... }
}

public class DohProcessor
    : IProcessor
{
     public DohProcessor(DohSettings) { ... }
}

// There might be many more processor types with matching settings...

public interface IProcessorConsumer {}

public class ProcessorConsumer 
    : IProcessorConsumer
{
     public ProcessorConsumer(IProcessor processor) { ... }
}

Экземпляр FooSettings или BarSettings предоставляется из внешнего источника, то есть:

object settings = GetSettings();

И теперь я хотел бы разрешить ProcessorConsumer на основе внедрения существующий экземпляр настроек, например:

container.RegisterAssemblyTypes(...); // Or similar
container.Inject(settings);
var consumer = container.Resolve<IProcessorConsumer>();

То есть, если предоставляется экземпляр FooSettings, то создается FooProcessor и вводится в ProcessorConsumer, который затем является разрешенным экземпляром.

Я не мог понять, как это сделать это либо в StructureMap, Ninject, либо в Autofac ... вероятно, потому что я новичок, когда дело доходит до контейнеров IoC. Поэтому ответы для всех этих или других контейнеров, чтобы их можно было сравнить, были бы очень признательны.

ОБНОВЛЕНИЕ: Я ищу решение, которое легко позволяет добавлять новые настройки и процессоры. Также будет однозначное сопоставление от типа настроек к типу процессора. Но это также позволяет внедрять другие экземпляры / службы в данный тип процессора на основе его параметров конструктора. Т.е. какому-то процессору может потребоваться служба IResourceProvider или что-то подобное. Вот пример.

В идеале, я бы хотел что-то вроде

container.For<IProcessor>.InjectConstructorParameter(settings)

или подобное. Тем самым направляя контейнер IoC на использование типа процессора, соответствующего внедренному экземпляру параметра конструктора.

6
задан nietras 24 June 2011 в 09:38
поделиться