это, вероятно, вопрос новичка, но у меня есть следующее:
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 на использование типа процессора, соответствующего внедренному экземпляру параметра конструктора.