StructureMap:选择嵌套依赖项的具体类型
计算器:
public interface ICalculator { int Calculate(int a, int b); } public class Calculator : ICalculator { private readonly ICalculatorStrategy _calculatorStrategy; public Calculator(ICalculatorStrategy calculatorStrategy) { _calculatorStrategy = calculatorStrategy; } public int Calculate(int a, int b) { return _calculatorStrategy.Calculate(a, b); } }
计算器stragies:
public interface ICalculatorStrategy { int Calculate(int a, int b); } public class AdditionCalculator : ICalculatorStrategy { public int Calculate(int a, int b) { return a + b; } } public class MultiplyCalculator : ICalculatorStrategy { public int Calculate(int a, int b) { return a * b; } }
计算器用法:
public class CalculatorUsageOne { private readonly ICalculator _calculator; public CalculatorUsageOne(ICalculator calculator) { _calculator = calculator; } public void Process() { Console.WriteLine(_calculator.Calculate(6, 5)); } } public class CalculatorUsageTwo { private readonly ICalculator _calculator; public CalculatorUsageTwo(ICalculator calculator) { _calculator = calculator; } public void Process() { Console.WriteLine(_calculator.Calculate(6, 5)); } }
结构图注册表:
public class DependencyRegistry : Registry { public DependencyRegistry() { For().Use().Named("Addition"); For().Use().Named("Multiply"); For().Use(); } }
对于CalculatorUsageOne,我想添加数字(使用AdditionCalculator )。 对于CalculatorUsageTwo我想要乘以数字(使用MultiplyCalculator )。
我如何使用StructureMap实现这一目标?
试试这样:
For().Use () .Ctor().Is( x => x.Ctor().Is() ); For().Use () .Ctor().Is( x => x.Ctor().Is() );
您可以根据需要嵌套对象图形配置。 无论如何,我会考虑在这里使用generics以更明确的方式显示依赖关系。
编辑generics:
是否使用generics是一个好主意,取决于您的方案。 如果您没有有目的地为您的CalculatorUsages
指定具体的依赖关系,并且您的目标是使其与策略无关,那么您的解决方案似乎是最好的。
但是,如果您只需要在“中间层”中使用Calculator
的通用实现,则可以在通用参数中指定Calculator
的依赖关系以使其显式化。 也许这不是最好的用例,但它可以像这样:
public class CalculatorUsageOne { public CalculatorUsageOne(ICalculator calculator) { // ... } } public class Calculator where T : ICalculatorStrategy { public Calculator(T strategy) { // ... } }
并注册如下:
For(typeof(ICalculator<>).Use(typeof(Calculator<>);
这将告诉StructureMap将所请求的ICalculator
任何generics参数传递给Calculator
( open generics ),然后在构造函数中实例化策略对象。
或者,您可以使用标记接口而不是generics,但再一次,这一切都取决于您的特定场景,并且从一开始就可能是最简单的解决方案。
一种方法是在使用With
方法获取实例时定义依赖关系。
var additionStrategy = ObjectFactory .GetNamedInstance("Addition"); var c1 = ObjectFactory.With(additionStrategy).GetInstance();
我能想到的另一种方法是在注册类型时提供isntances作为构造函数参数。 我明天可以提供一个例子。