我有一个古老的谜题,所以我想我会与你分享,可能会得到正确的方向。问题是,我们在数据库中的一些实体非常大(读取有很多属性),很少业务逻辑使用所有实体属性,所以每次我需要考虑必须加载哪些属性才能使业务逻辑正常工作。非常假设的样本:
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,但这看起来有点矫枉过正(至少我没有看到任何人使用接口对属性进行分组) .
将数据库中的实体拆分为更小的实体看起来也不合理,因为所有这些属性都属于产品,恐怕我将被迫使用许多连接来选择某些东西,如果我决定某些属性属于另一个实体,这一举措将很难实施。
让特定方法的业务逻辑中使用的每个属性都作为方法参数看起来也很糟糕。