假设我有下面列出的类,用于通过 Web 服务将数据传递给客户端(类已简化):
public class Customer
{
public int CustomerId { get; set; }
public string Name { get; set; }
public List<Sales> CustomerSales
{
get { /*code to return list of customersales */ }
}
public double TotalSalesAmount
{
get { /*code that return total sales amount for customer*/ }
}
public double AverageSalesPerMonth
{
get { /*code that return average sales amount per month for customer*/ }
}
}
public class Sales
{
public int SalesId { get; set; }
public int CustomerId { get; set; }
public DateTime SalesDate { get; set; }
public double SalesAmount { get; set; }
}
我的问题是关于这两个属性:
public double TotalSalesAmount
{
get { /*code that return total sales amount for customer*/ }
}
public double AverageSalesPerMonth
{
get { /*code that return average sales amount per month for customer*/ }
}
有时客户端只需要客户信息,即 CustomerId 和 Name,有时需要 CustomerId、名称和TotalSalesAmount或其组合等。对此的最佳实践是什么?我发现了一些关于这个主题的讨论,并提出了以下建议:
- 为每个场景创建一个 DTO(这意味着我最终会得到 100 个 DTO,因为示例已被简化)
- 为每个计算创建一个单独的服务方法,并根据需要执行方法(这意味着将进行大量服务调用)
- 将属性保留在上面的类中(这意味着大量的开销 - 某些计算可能会占用大量资源 - 这不是必需的)
我确信对此没有 Elixir ,但想知道最好的方法是什么?
最佳答案
我同意@Luu - 一般来说 - 但我会使用枚举而不是 bool 标志 - 例如:
public Customer GetCustomerInformation(int customerId, LevelOfDetail detail
= LevelOfDetail.All)
{
var customer = new Customer { CustomerId = customerId };
customer.TotalSalesAmount = detail.HasFlag(LevelOfDetail.TotalSalesAmount) ? CalculateTotalSales(customerId) : null;
// etc
return customer;
}
[Flags]
public enum LevelOfDetail : int
{
TotalSalesAmount = (1 << 0),
AverageSalesPerMonth = (1 << 1),
All = TotalSalesAmount | AverageSalesPerMonth
}
关于c# - 选择性 POCO 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653776/