gpt4 book ai didi

c# - StructureMap:选择嵌套依赖的具体类型

转载 作者:太空狗 更新时间:2023-10-29 23:18:04 25 4
gpt4 key购买 nike

计算器:

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);
}
}

计算器策略:

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<ICalculatorStrategy>().Use<AdditionCalculator>().Named("Addition");
For<ICalculatorStrategy>().Use<MultiplyCalculator>().Named("Multiply");
For<ICalculator>().Use<Calculator.Calculator>();
}
}

对于 CalculatorUsageOne,我想添加数字(使用 AdditionCalculator)。对于 CalculatorUsageTwo,我想将数字相乘(使用 MultiplyCalculator)。

如何使用 StructureMap 实现这一目标?

最佳答案

像这样尝试:

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 ( open generics ),然后在构造函数中实例化策略对象。

或者,您可以使用 marker interfaces而不是泛型,但再一次,这完全取决于您的特定场景,并且可能从一开始就是最简单的解决方案。

关于c# - StructureMap:选择嵌套依赖的具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6575883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com