【问题标题】:What is the best practice when implementing a data transfer object or POCO ? How should your POCOs look like?实现数据传输对象或 POCO 时的最佳实践是什么?你的 POCO 应该是什么样子?
【发布时间】:2009-03-11 19:38:45
【问题描述】:

以下哪项是实现 poco 的最佳方式?

选项 1:

public class PocoOption1
{
  public PocoOption1(int val1,string val2)
  {
    Val1=val1; Val2=val2;
  }

  public int Val1{get;private set;}
  public int Val2{get;private set;}
}

选项 2:

public class PocoOption2
{           
  public int Val1{get;set;}
  public int Val2{get;set;}
}

每种方法的潜在利弊是什么?有关系吗? 有人说一个 DTO 应该只设置一次。是规则还是意见?

【问题讨论】:

    标签: poco


    【解决方案1】:

    选项略有不同。选项 1 只允许您设置 Val1、Val2 一次。选项 2 允许您设置和重置这些值。

    总的来说,我是公共默认构造函数的粉丝。它使 API 更易于使用。 Krzysztof Cwalina 和 Brad Abrams 在框架设计指南一书中对此进行了详细讨论。以下是重点:

    • 使用“创建、设置、调用”模式。有一个没有参数的默认构造函数。然后允许在对象上设置属性(以任何顺序)。然后允许调用方法。
    • 默认构造函数是对象构造的规范方法。这将是用户尝试的第一个选项。
    • 强制用户在构建时选择参数可能很困难。此外,某些参数可能是可选的。
    • 让您的对象在有限的时间内处于无效状态。抛出异常以传达 API 滥用。 (如果一个对象有两个依赖项,那么如果用户尝试在没有必要设置的情况下调用方法,则抛出 InvalidOperationException。)

    在我看来,选项 2 是可行的方法。

    【讨论】:

      【解决方案2】:

      使用新的 C# 语法,您可以执行以下操作:

      Customer customer =  new Customer{ Id = 1, 
           Name="Dave",                                             
           City = "Sarasota" };
      

      您可以安全地使用选项 2。

      请查看here

      【讨论】:

      • 没错,但是有人说一个 DTO 应该只设置一次。这真的是一个规则还是只是一个意见??
      • 我从来没有听说过这个。你有网址吗?
      • @Perpertualcode:规则?我不会走那么远。我的意思是你不需要定义一个带有所有参数的构造函数来初始化。对我来说,这也是一个维护问题:如果我添加一个新属性,我必须更改构造函数。
      • @ocdecio = 选项 1 是否使其不可变?有些人喜欢那些他们不喜欢 F# 或其他东西的东西吗?只是好奇
      • @Perpertualcode:没有这样的事情,除非你想以只读方式声明属性。
      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多