gpt4 book ai didi

c# - 实体做得太多?

转载 作者:太空狗 更新时间:2023-10-29 20:40:14 25 4
gpt4 key购买 nike

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

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;
}
}

看起来我可以提取接口(interface) IDiscountProduct 和 ISearchResultProduct,将产品标记为实现这些接口(interface),然后创建更小的 DTO 来实现每个接口(interface),但目前看来这太过分了(至少我还没有看到任何人对属性进行分组使用接口(interface))。

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

将特定方法的业务逻辑中使用的每个属性都作为方法参数看起来也是一个糟糕的解决方案。

最佳答案

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

以下几点是针对简单的属性(例如标题)

  1. 没有额外的代码(仅获得此产品的标题,或仅获得价格,等等)
  2. 产品实例始终是完整的,因此您可以传递它而无需检查属性是否为 null。
  3. 如果您必须延迟加载某些其他属性,那么它比急切加载它们的成本更高。如果您有 20 个属性 - 这甚至不是一个大对象(同样,如果您的(假设的)Description 属性的大小不是千字节)。

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

关于c# - 实体做得太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com