【问题标题】:Using app-level settings in rich domain models在富域模型中使用应用级设置
【发布时间】:2019-02-19 00:04:59
【问题描述】:

我想要在我的富域模型中使用一个全局/应用级别设置。

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

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

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 的回答下的评论中问了这个问题:App-level settings in DDD?

【问题讨论】:

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

标签: c# asp.net-core domain-driven-design domain-model rich-domain-model


【解决方案1】:

正如Clean Code 解释的那样,将标志传递给方法通常被认为是次优设计。我知道 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 对象注入到任何需要它的类中。在您的Composition Root 中,您可以读取配置文件,或以其他方式决定使用哪个实现,然后仅创建该类的单个实例。这给了对象Singleton生命周期,因此计算方法在启动时完全被选择,并在应用程序中的所有对象之间共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2012-12-31
    • 2010-09-27
    • 2020-08-25
    • 2022-01-15
    • 2014-06-12
    • 2017-07-06
    相关资源
    最近更新 更多