Попробуйте так:
For<CalculatorUsageOne>().Use<CalculatorUsageOne>()
.Ctor<ICalculator>().Is<Calculator.Calculator>(
x => x.Ctor<ICalculatorStrategy>().Is<AdditionCalculator>()
);
For<CalculatorUsageTwo>().Use<CalculatorUsageTwo>()
.Ctor<ICalculator>().Is<Calculator.Calculator>(
x => x.Ctor<ICalculatorStrategy>().Is<MultiplyCalculator>()
);
Вы можете вкладывать конфигурации графа объектов так глубоко, как вам нужно.В любом случае, я бы подумал об использовании обобщений здесь, чтобы показать зависимости более явным образом.
редактировать о дженериках:
Является ли использование дженериков хорошей идеей, зависит от вашего сценария.Если вы не указали конкретные зависимости для вашего CalculatorUsages
специально, и ваша цель - сделать его независимым от стратегии, ваше решение кажется лучшим.
Но если вам просто нужна общая реализация Calculator
в «среднем слое», вы можете указать зависимость Calculator
в универсальном параметре, чтобы сделать его явным.Возможно, это не лучший вариант использования, но он может выглядеть примерно так:
public class CalculatorUsageOne
{
public CalculatorUsageOne(ICalculator<AdditionCalculator> calculator)
{
// ...
}
}
public class Calculator<T> where T : ICalculatorStrategy
{
public Calculator(T strategy)
{
// ...
}
}
и регистрировать его следующим образом:
For(typeof(ICalculator<>).Use(typeof(Calculator<>);
Это скажет StructureMap передать любой универсальный параметрдля запрошенных ICalculator
до Calculator
( открытых обобщений ), которые затем создают объекты стратегии в конструкторе.
В качестве альтернативы вы можете использовать маркерные интерфейсы вместогенерики, но, опять же, все зависит от вашего конкретного сценария, и, возможно, самое простое решение с самого начала подходит лучше всего.