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作为构造函数参数。 我明天可以提供一个例子。