C# 在富域模型中使用应用程序级别设置

C# 在富域模型中使用应用程序级别设置,c#,asp.net-core,domain-driven-design,domain-model,rich-domain-model,C#,Asp.net Core,Domain Driven Design,Domain Model,Rich Domain Model,我想在我的富域模型中使用全局/应用程序级别设置 我有一个方法,可以根据传递的参数进行一些计算 这可能不是最好的示例,也可能看起来不像是属于域模型的方法,但我尽量保持简单,以便您能够理解问题 public decimal Calculate(CalculationMethod calculationMethod) { switch (calculationMethod) { case CalculationMethod.Multiply:

我想在我的富域模型中使用全局/应用程序级别设置

我有一个方法,可以根据传递的参数进行一些计算

这可能不是最好的示例,也可能看起来不像是属于域模型的方法,但我尽量保持简单,以便您能够理解问题

public decimal Calculate(CalculationMethod calculationMethod)
{
    switch (calculationMethod)
    {
        case CalculationMethod.Multiply: 
            return _x * _y; // _x and _y are fields
        case CalculationMethod.Divide: 
            return _x / _y;
    }
}
现在让我们假设在我的其他领域模型中有许多这样的方法,它们在方法中也接受
CalculationMethod
。我希望有一个全局设置,这样我就可以全局设置一个计算方法,这样所有将其作为参数的方法都可以使用它

一种解决方案是每次调用此方法时读取配置

我想知道是否有更好的方法,这样我可以全局设置
CalculationMethod
,而不传递它,而是使用某种静态变量(单例)来保存计算方法,并直接在我的方法中读取它,而不传递它。但我认为那时会出现线程安全问题

public decimal Calculate()
{
    // or read it from file here?
    switch (GlobalSettings.CalculationMethod)
    {
        case CalculationMethod.Multiply: 
            return _x * _y; // _x and _y are fields
        case CalculationMethod.Divide: 
            return _x / _y;
    }
}
我不能在构造函数中传递它,因为它不是属于我的域模型的东西

如何处理这类问题?还有比我提到的两个更好的方法吗

我在Mark Seemann的回答下的评论中问了这个问题:

正如所解释的,向方法传递标志通常被认为是次优设计。我知道OP是另一个更复杂问题的替代品,但我倾向于建议重构为多态对象模型:

public interface ICalculator
{
    decimal Calculate();
}
现在,您可以根据需要定义实现:

public class Multiplier : ICalculator
{
    public decimal Calculate()
    {
        return _x * _y; // _x and _y are fields
    }
}

public class Divider : ICalculator
{
    public decimal Calculate()
    {
        return _x / _y;
    }
}

您可以使用构造函数注入将
ICalculator
对象注入到任何需要它的类中。在中,您可以读取配置文件,或者以其他方式决定使用哪个实现,然后只创建该类的单个实例。这为对象提供了单例生存期,以便在启动时完全选择计算方法,并在应用程序中的所有对象之间共享。

单例模式?您可以在应用程序启动时读取一次设置,然后在需要的任何地方将它们注入IoC容器。例如,通过构造函数注入。顺便说一句,singleton的正确实现是线程安全的。@KozhevnikovDmitry我不想在我的域模型中注入任何东西。它们只是数据持有者,其逻辑仅对该数据执行。注入服务层类,然后作为参数传递,就像第一个示例中所做的那样。或者使用单例。是的,这些是选项