2

这个问题是针对我正在处理的 Java 项目的,但也适用于 C#。

无论如何,所以我有一个 MVC Web 项目。在其中,我的数据有三个“层”。

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,因此可能会覆盖自定义逻辑。这是一个业务流程吗?

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

感谢您的建议。

4

5 回答 5

2

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

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

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

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

于 2012-09-12T14:59:01.357 回答
1

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

于 2012-09-12T15:00:20.103 回答
0

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

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

我不认为获取一个人的全名是一个业务流程。

于 2012-09-12T14:58:49.533 回答
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
}
于 2012-09-12T16:13:14.363 回答
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”,或者作为整数或位,我必须在编程中使用它们作为布尔值。

因此,我在数据访问层使用了一些逻辑,并将这些字段作为布尔值进行读写。

干杯。

于 2012-09-12T15:23:12.920 回答