7

我有一个古老的谜题,所以我想我会与你分享,可能会得到正确的方向。问题是,我们在数据库中的一些实体非常大(读取有很多属性),很少业务逻辑使用所有实体属性,所以每次我需要考虑必须加载哪些属性才能使业务逻辑正常工作。非常假设的样本:

public class Product 
{
    public string Title {get;set;}
    public string Description {get;set;}

    public string RetailPrice {get;set;}
    public string SupplierId {get;set;}

    public Supplier Supplier { get;set;}

    // many other properties
}

public class ProductDiscountService
{
    public decimal Get(Product product)
    {
        // use only RetailPrice and Supplier code
        return discount;
    }
}

public class ProductDescriptionService 
{
    public string GetSearchResultHtml(Product product) 
    {
        // use only Title and Description
        return html;
    }
}

看起来我可以提取接口 IDiscountProduct 和 ISearchResultProduct,将产品标记为实现这些接口,然后创建实现每个接口的较小 DTO,但这看起来有点矫枉过正(至少我没有看到任何人使用接口对属性进行分组) .

将数据库中的实体拆分为更小的实体看起来也不合理,因为所有这些属性都属于产品,恐怕我将被迫使用许多连接来选择某些东西,如果我决定某些属性属于另一个实体,这一举措将很难实施。

让特定方法的业务逻辑中使用的每个属性都作为方法参数看起来也很糟糕。

4

1 回答 1

1

除非属性很大(读取长字符串和/或二进制文件),否则我会全部加载它们。

以下几点适用于简单的属性(例如标题)

  1. 没有额外的代码(仅以标题获取此产品,或仅以价格获取,等等)
  2. 产品实例始终是完整的,因此您可以在不检查属性是否为空的情况下传递它。
  3. 如果您必须延迟加载一些其他属性,那么它会比急切地加载它们花费更多。如果您有 20 个属性 - 这甚至不是一个大对象(同样,如果您的(假设的)描述属性的大小不是千字节)。

现在,如果您有相关对象(ProductSupplier) - 这应该是延迟加载的,imo,除非您知道将使用此属性。

于 2012-06-05T16:28:24.140 回答