我有一个Dto,我想要启用服务层来过滤:
方法selectFields
采用应返回的字段名称数组,其他属性将被删除
什么是枚举类的属性的简短方法,以便我可以遍历它们并将过滤后的属性设置为null?
在BaseDto我负责清理假值(我在这里也需要相同的功能)。
class UserServiceDto extends BaseDto {
constructor(userDto) {
super();
this.fbUserId = userDto.fbUserId;
this.fbFirstName = userDto.fbFirstName;
this.fbLastName = userDto.fbLastName;
this.gender = userDto.gender;
this.birthdate = userDto.birthdate;
this.aboutMe = userDto.aboutMe;
this.deviceToken = userDto.deviceToken;
this.refreshToken = userDto.refreshToken;
this.updatedAt = userDto.updatedAt;
this.createdAt = userDto.createdAt;
}
selectFields(fields) {
// --> what's your take?
}
toJson() {
return super.toJson();
}
}
编辑:
服务层从存储库层接收dto,包括所有数据库字段。 ServiceLayerDto旨在过滤掉web api不需要的字段(或者不应作为安全措施公开,例如PK字段,isDeleted等)。因此结果是我看到服务方法的结尾看起来像:
return new UserServiceDto(userDto)
.selectFields('fbUserId', 'fbFirstName', 'fbLastName', 'birthdate', 'aboutMe', 'updatedAt', 'createdAt')
.toJson();
返回值将是web层(控制器)发送回http客户端的普通json对象。
答案 0 :(得分:2)
如果您对扩展运算符没问题,可以尝试以下方法:
class UserServiceDto {
constructor() {
this.a = 1;
this.b = 2;
this.c = 3;
}
selectFields(...fields) {
const result = {};
fields.forEach(key => result[key] = this[key]);
return result;
}
}
new UserServiceDto().selectFields('a', 'c'); // {a: 1, c: 3}
期待super.toJson()
调用,我认为由于selectFields()
调用的结果不会是UserServiceDto
类的实例而无效。从这一点来看,我有一些可能的方法:
UserServiceDto
正文中实例化新的selectFields()
对象,删除...fields
数组中列出 的所有字段(javascript delete
为okey)并将其归还; UserServiceDto
构造函数参数来保存selectFields()
上的正逻辑,并仅传递给需要设置的道具的构造函数;在这种情况下,实例化临时对象不需要删除属性; toJson
方法的签名,或者更好地添加新签名,这将允许传递字段数组,然后将当前selectFields
逻辑放在toJson
方法中(并删除{{总共1}}方法):selectFields
... 答案 1 :(得分:0)
纯粹是为了获取信息,我最终改变了我的应用程序架构。
存储库将Dto返回到服务层(dto直接从sql查询映射) 该服务基于Dto构建静态视图并将其返回到Web层(由普通json对象表示)。
在我的目录结构中,我有:
get(1)
视图是一个简单的过滤器。例如。 UserInfoView:
- service
-- views
--- index.js
--- UserInfo.js
使用视图,例如服务中的UserInfoView如下所示:
exports.build = ({ fbUserId, fbFirstName, fbLastName, gender, birthdate, aboutMe, updatedAt, createdAt }) => {
return {
fbUserId,
fbFirstName,
fbLastName,
gender,
birthdate,
aboutMe,
updatedAt,
createdAt,
};
};
我认为与我最初对这个问题的看法相比,这更具描述性。此外,它使数据对象保持平稳(无需其他方法) 遗憾的是,我无法在Web层中接收类型(View),我可能稍后可以使用Typescript解决该问题。