это, наверное, просто вопрос новичка, но у меня есть следующее:
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 предоставляется из внешнего источника, то есть ::1004*.
object settings = GetSettings();
А теперь я хотел бы разрешить ProcessorConsumer на основе внедрения существующего экземпляра настроек, например ::100100
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 использовать тип процессора, соответствующий экземпляру параметра внедренного конструктора.