c# - 选择性 POCO 属性

标签 c# web-services serialization poco dto

假设我有下面列出的类,用于通过 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*/ }
    }

有时客户端只需要客户信息,即 CustomerIdName,有时需要 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/

相关文章:

C# 插入 MySQL 将 0 替换指定数据?

c# - 是否可以使用 EF7 执行自定义 SQL 查询

java - 使用序列化是个好主意吗?

c++ - 如何使用 QDatastream 在 QT 中正确序列化和反序列化 QList 类?

c# - 如何将文件路径数组分成几个较小的数组?

c# - 传递一个 Action 作为引用

php - 取消使用 PHP 提交的网络表单

java - 解码 Web 服务响应时出错

java - Java Web 应用程序中的地理围栏

java - GWT 奇怪的序列化异常