C# 我的实体只有setter和getter,但没有方法-设计失败-

C# 我的实体只有setter和getter,但没有方法-设计失败-,c#,architecture,poco,C#,Architecture,Poco,我读过一次: “除非有充分的理由,否则不要将实体作为一袋袋的getter和setter,并将它们的方法放在另一层中” 我的客户,订单。。。对象只是从SqlDataReaders获取数据。他们只有接球手和二传手 我的第一个问题是,当有人在实体中实现方法时,会遵循哪种设计方法?这些方法在做什么?当您的模型中包含方法时,您应该只包含特定于模型的逻辑类型。例如,考虑银行账户: public class Account { public AccountId Id { get; set; } p

我读过一次:

“除非有充分的理由,否则不要将实体作为一袋袋的getter和setter,并将它们的方法放在另一层中”

我的客户,订单。。。对象只是从SqlDataReaders获取数据。他们只有接球手和二传手


我的第一个问题是,当有人在实体中实现方法时,会遵循哪种设计方法?这些方法在做什么?

当您的模型中包含方法时,您应该只包含特定于模型的逻辑类型。例如,考虑银行账户:

public class Account {
   public AccountId Id { get; set; }
   public Person Customer {get; set; }

   public void Credit(Money amount) { ... }
   public void Debit(Money amount) { ... } 

}
贷方和借方是特定于模型的逻辑(在应用程序的其他任何地方都找不到),应该封装在Account类中

您还提到在模型类中使用SqlDataReader从数据库获取数据。这是一个很大的反模式。以下是您将遇到的一些问题:

  • 违反单一责任原则-模型现在负责表示数据并从数据库获取数据
  • 查询模型中的子对象怎么样?事情变得一团糟
  • 您将无法轻松更改数据访问权限
    保持模型倾斜。将数据访问逻辑放在存储库中,即AccountRepository。

    当您将方法作为模型的一部分时,您应该只包含特定于模型的逻辑类型。例如,考虑银行账户:

    public class Account {
       public AccountId Id { get; set; }
       public Person Customer {get; set; }
    
       public void Credit(Money amount) { ... }
       public void Debit(Money amount) { ... } 
    
    }
    
    贷方和借方是特定于模型的逻辑(在应用程序的其他任何地方都找不到),应该封装在Account类中

    您还提到在模型类中使用SqlDataReader从数据库获取数据。这是一个很大的反模式。以下是您将遇到的一些问题:

  • 违反单一责任原则-模型现在负责表示数据并从数据库获取数据
  • 查询模型中的子对象怎么样?事情变得一团糟
  • 您将无法轻松更改数据访问权限
    保持模型倾斜。将数据访问逻辑放入存储库,即AccountRepository。

    这种思维方式来自领域驱动的设计社区

    在DDD中,您创建一个域模型,该模型捕获用户请求的功能。您将实体设计为具有其所需的功能和数据。您将它们聚集在一起,并且有单独的类负责构建(工厂)和查询(存储库)

    如果你只有getter/setter,那么你就有了一个“贫血的领域模型”。马丁·福勒在这篇文章中写到了这一点

    一个贫乏的域模型的问题是,你有将数据库映射到对象的开销,但没有它的好处。如果您不使用实体作为真正的域模型,为什么不使用DataTable或其他数据,并将业务逻辑保留在单独的函数中?贫血区域模型是一种应避免的反模式


    您还提到您自己映射实体。解释了为什么使用对象关系映射工具可以真正有所帮助。如果您使用实体框架和代码优先的方法,那么您可以编写一个包含数据和功能的干净域模型,并将其映射到数据库,而无需太多麻烦。然后,你将两全其美。

    这种思维方式来自领域驱动的设计社区

    在DDD中,您创建一个域模型,该模型捕获用户请求的功能。您将实体设计为具有其所需的功能和数据。您将它们聚集在一起,并且有单独的类负责构建(工厂)和查询(存储库)

    如果你只有getter/setter,那么你就有了一个“贫血的领域模型”。马丁·福勒在这篇文章中写到了这一点

    一个贫乏的域模型的问题是,你有将数据库映射到对象的开销,但没有它的好处。如果您不使用实体作为真正的域模型,为什么不使用DataTable或其他数据,并将业务逻辑保留在单独的函数中?贫血区域模型是一种应避免的反模式


    您还提到您自己映射实体。解释了为什么使用对象关系映射工具可以真正有所帮助。如果您使用实体框架和代码优先的方法,那么您可以编写一个包含数据和功能的干净域模型,并将其映射到数据库,而无需太多麻烦。这样您就可以两全其美。

    听起来像是在使用对象作为数据模型。这在很大程度上是好的。一般的建议是避免使用称为god对象的反模式,其中一个对象包含所有逻辑的每一部分。听起来更像是一个问题,因为听起来像是将对象用作数据模型。这在很大程度上是好的。一般的建议是避免使用一种称为“上帝对象”的反模式,即一个对象包含所有逻辑的每一部分