2014-03-13 33 views
0

我正在开发一个相当大的项目,但我不确定当前的体系结构是否可以完成任务。我们有一个对象是这样的:C#字段已更新

public class Order() 
{ 
    public int id; 
    public int TotalProductsWeight { get; private set;} 
    public IList<Products> prodList = new List<Products>() { get; private set;} 

    public void AddProducts(IList<Products> prod) 
    { 
     prodList.AddRange(prod); 

     foreach(var e in prodList) 
      //Doing complex stuff and put the result in TotalProductWeight 
    } 
} 

有一个场TotalProductsWeight这是昂贵的计算,所以我们加入了新的产品,只有当更新。问题是这个对象被保存到一个数据库中,当我们从同一个数据库中读取它时,我们想要加载之前保存的TotalProductsweight

我在想的唯一的解决方案是调用一个方法,更新TotalProductsWeight,忽略数据库上的值。

[编辑] 现在的问题是:是否有一种方法来存储一个复杂的计算结果在一个对象中,所以我们不需要每次重新计算它,同时在该字段中加载一个值只有当从数据库中读取而不显示其余代码中的字段?

+3

你准确的问题是什么? – Casey

+0

我会对冲计算'TotalProductWeight'的赌注,对于一台机器来说不会太多。不看计算就很难说。 – Simon

+0

@Simon TotalWeight是一个愚蠢的例子,真实计算的复杂性是二次的 – Federico

回答

3

这听起来像是懒惰评估容易处理的事情。考虑这样的事情:

public class Order() 
{ 
    public int id; 

    // Cached total weight. 
    private int _totalProductsWeight; 

    // When true, must compute weight before returning 
    private bool _dirtyFlag; 

    public int TotalProductsWeight 
    { 
     get 
     { 
      if (_dirtyFlag) 
      { 
       _totalProductsWeight = ComputeWeight(); 
       _dirtyFlag = false; 
      } 
      return _totalProductsWeight; 
     } 
    } 

    public IList<Products> prodList = new List<Products>() { get; private set;} 

    public void AddProducts(IList<Products> prod) 
    { 
     prodList.AddRange(prod); 

     // Mark the weight as dirty. 
     _dirtyFlag = true; 
    } 
} 

现在,你只计算你需要的总重量。因此,您可以在产品列表中添加一百个项目,并且在有人第一次请求时不必计算重量。

为了存储在数据库中,您可以根据需要存储权重,以及从数据库加载时只需将脏标志设置为false即可。如果您不想存储总重量,请确保在加载对象数据时将脏标记设置为true。这样,它会在有人第一次要求时计算重量。另外,如果将此信息存储在数据库中,则总会有人从数据库中删除产品并且不更新总重量的风险。在这种情况下,如果您坚持总体重量并将其读回来,则数据不一致。这取决于您是否确实应该防范的真正风险。如果你认为它可能发生,那么你可能不应该坚持总权重字段,而是在加载时(或第一次查询时)重新计算它。

请注意,当您这样做时,应该访问_totalProductsWeight字段的唯一代码是get访问器和将其写入数据库并将其读回的代码。如果有任何其他代码读取_totalProductsWeight,则可能会读取旧值。 (不是我曾犯过这个错误,请介意你... 咳嗽