在类中依赖计算属性的设计模式?

For*_*ing 6 c# nhibernate design-patterns

我有一个表示包含许多计算属性的域实体的类​​.大多数计算依赖于也计算的其他属性.在它最简单的形式中,类的示例可能看起来像这样.

public class AnalysisEntity
{
    public decimal InputA { get; set; }
    public decimal InputB { get; set; }
    public decimal InputC { get; set; }

    public decimal CalculatedValueA
    {
        get { return InputA * InputC; }
    }

    public decimal CalculatedValueB
    {
        get 
        {
            decimal factor = FactorGenerator.ExpensiveOperation();
            return CalculatedValueA / factor; 
        }
    }

    public decimal CalculatedValueC
    {
        get { return InputA * InputB; }
    }

    public decimal CalculatedValueD
    {
        get { return (CalculatedValueA * InputB) / CalculatedValueB; }
    }

    public decimal CalculatedValueE
    {
        get { return CalculatedValueD / aConstant; }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这个解决方案让我有以下问题:

  1. 一些计算(其中一些是冗长的)被重复调用是低效的.
  2. 单独测试单个计算是很困难的,而不是为所有相关计算提供所有必需的输入以便首先工作.
  3. 很难有效地从持久性中检索(我正在使用NHibernate),因为即使计算出的数据可以存储到数据库中,也不会检索它,而是在读取对象时重新计算.
  4. 随着单元测试随所需输入变得越来越大,很难添加计算.

我已经尝试使用计算器对象和策略模式来设置属性的内部字段,但我最终得到了一个过长的控制函数来强制进行计算.同时将所有计算移动到另一个对象会将原始实体转变为贫血域对象,我应该避免阅读.

我应该使用哪些设计模式和类结构来解决上述问题?

谢谢

小智 5

在写路径上进行工作,而不是读取路径.然后,您可以从持久层填充最新的缓存值,而无需担心.

因此,当写入值A时,所有依赖于A的计算都将重做.

在读取次数大于写入次数的情况下,此方案非常有效.