我应该在哪里为对象添加自定义属性?在POJO / POCO类或服务层?

时间:2012-09-12 14:54:20

标签: c# java n-tier-architecture business-logic

这个问题适用于我正在研究的Java项目,但也适用于C#。

无论如何,我有一个MVC网络项目。在其中,我有三个“层”用于我的数据。

com.example.model.dao
com.example.model.entities
com.example.model.service

所以dao是我的低级数据库类。像Hibernate包装等等。 entities是我的POJO,service是我的业务逻辑。

现在让我们说其中一个POJO是User。在User中,它映射到名为users的数据库表。此表(和POJO)有两个字段firstnamelastname。好的,所以我想把一个名为 getFullName 的方法放在简单地连接名字和姓氏的地方。

那么这种方法应该去哪里?我想把它放在POJO本身。但是,由于有时我们使用工具从数据库生成POJO,因此可能会覆盖自定义逻辑。这是一个业务流程吗?

我应该把它放在我的服务实现中吗?

感谢您的建议。

5 个答案:

答案 0 :(得分:2)

在c#中我会使用一个部分类(它解决了“生成的类”问题:当然,你生成的POCO需要是部分的)

public partial class User {
   public string GetFullName() {
     return string.Format("{0} {1}", FirstName, LastName);
   }
}

在Java中不起作用的解决方案......因为部分类不存在!

因此,对于这两种语言来说,“最合适”的解决方案可能并不相同。

答案 1 :(得分:1)

您应该在业务层中实现自定义业务逻辑。在这种情况下,当您生成POJO时,它应该在您的服务层中。

答案 2 :(得分:0)

我通常将这种类型的方法放在实体本身中,但是既然你说它可以被覆盖,你就可以为实体使用一个辅助类。

class UserHelper {
  String getFullName() {
    ...
  } 
  ... more methods
}

我不认为将某人的全名视为业务流程。

答案 3 :(得分:0)

正如这里的许多开发人员,我对设计模式,最佳实践和标准非常严格,但是......

......规则总是有例外,或者更准确地说明指南。

开发人员通常会将这种函数放在逻辑层上,但在某些情况下,可以将它添加到Plain Old(Java / C#/ ...)对象中。

伪代码:

class DataAccessLayerPerson
{
  public FirstName
  {
    get; set;
  }

  public MiddleName
  {
    get; set;
  }

  public LastName
  {
    get; set;
  }

  public getFullName()
  {
     return FirstName + MiddleName + LastName;
  }
}

class BusinessLogicLayerPerson
{
  public FirstName
  {
    get; set;
  }

  public MiddleName
  {
    get; set;
  }

  public LastName
  {
    get; set;
  }

  public FullName
  {
    get; set;
  }
}

类似的常见情况是,当一个表有一个概念上用作布尔值的字段,但是,以编程方式用作char(1)存储'f'或't',或者作为整数或作为位,我必须使用他们在编程中作为布尔值。

因此,我在数据访问层中使用了一些逻辑,并以布尔值的形式读取和写入这些字段。

干杯。

答案 4 :(得分:0)

我们的项目遇到了同样的问题,所以我们这样做了:

@MappedSuperclass
public class UserDTO {
   // this is the class which can be regenerated by code generator, and only contains database fields
}

@Entity
public class User extends UserDTO {
   // this is the class containing more business methods, methods do things that are not part of the database columns
}