这个问题适用于我正在研究的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)有两个字段firstname
和lastname
。好的,所以我想把一个名为 getFullName 的方法放在简单地连接名字和姓氏的地方。
那么这种方法应该去哪里?我想把它放在POJO本身。但是,由于有时我们使用工具从数据库生成POJO,因此可能会覆盖自定义逻辑。这是一个业务流程吗?
我应该把它放在我的服务实现中吗?
感谢您的建议。
答案 0 :(得分:2)
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
}