Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该将对象的自定义属性放在哪里?在POJO/POCO类中还是在服务层中?_C#_Java_N Tier Architecture_Business Logic - Fatal编程技术网

C# 我应该将对象的自定义属性放在哪里?在POJO/POCO类中还是在服务层中?

C# 我应该将对象的自定义属性放在哪里?在POJO/POCO类中还是在服务层中?,c#,java,n-tier-architecture,business-logic,C#,Java,N Tier Architecture,Business Logic,这个问题是针对我正在从事的一个Java项目提出的,但也适用于C# 总之,我有一个MVC web项目。在它里面,我有三个“层”来存放我的数据 com.example.model.dao com.example.model.entities com.example.model.service 所以dao是我的底层数据库类。像冬眠包装之类的东西。 实体是我的POJO,而服务是我的业务逻辑 现在让我们假设其中一个POJO是User。在User中,它映射到名为users的数据库表。此表(和POJO)有两

这个问题是针对我正在从事的一个Java项目提出的,但也适用于C#

总之,我有一个MVC web项目。在它里面,我有三个“层”来存放我的数据

com.example.model.dao
com.example.model.entities
com.example.model.service
所以
dao
是我的底层数据库类。像冬眠包装之类的东西。
实体
是我的POJO,而
服务
是我的业务逻辑

现在让我们假设其中一个POJO是
User
。在User中,它映射到名为
users
的数据库表。此表(和POJO)有两个字段,
firstname
lastname
。好的,我想把一个名为getFullName的方法放在某个地方,它只是将名字和姓氏连接起来

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

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


谢谢你的建议。

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

class UserHelper {
  String getFullName() {
    ...
  } 
  ... more methods
}
我不认为获取一个人的全名是一个业务流程。

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

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


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

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

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

……规则总是有例外,或者更确切地说,指导方针总是例外

开发人员通常将此类函数放在逻辑层上,但在某些情况下,可以将其添加到普通的旧(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;
  }
}
一个类似的常见情况是,当一个表的一个字段在概念上用作布尔值,但在编程上用作存储“f”或“t”的char(1),或作为整数或位,我必须在编程中作为布尔值使用它们

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


干杯。

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

@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
}

是的,我也喜欢这个主意。因为在本例中,您正在“重用”POCO。但是,这是否违反了“业务层”方法?我无法撼动这样一个事实:尽管非常简单,但这仍然是一个“业务”需求。@CBMeek好吧,在MVC世界中,您可以使用“UserViewModel”类,该类将具有全名属性(而不是方法)。你必须在完全严格、务实严格或完全不严格之间做出选择。您也是唯一知道哪种维护方式最简单的人,对于联合程序员,等等,您想称之为“业务”或“否”。我不会为这类事情提供ISO规则;)这确实是我所倾向的方向。而不是100%是因为我们用来生成POJO的工具。这对我来说“感觉很好”。但我仍然愿意接受我错的原因。通常,一个人的全名听起来不像是一个业务流程。然而,我们应该在哪里划定界限?它需要多复杂才能成为业务逻辑?不是争论,只是好奇。我会担心像这样的“一次性”会开始弄乱我的POJO。
@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
}