在 Dart 中将实体转换为干净架构中的模型

Hun*_*unt 6 design-patterns modelmapper dart clean-architecture

与干净的架构一样,我们必须定义EntitiesinDomain层和ModelsinData层。现在我面临的问题是当我们将其作为存储库中的请求对象传递时将其转换entities为。models

这是描述实体(棕色)和模型(绿色)之间关系的图表。

现在,将实体转换为模型的最简单方法是什么dart,因为实现一个mapper字段然后从另一个字段复制一个字段似乎是一项非常乏味的工作,并且当类中有嵌套对象时(i.e. UserProfile data in below diagram)需要花费大量时间。那么是否存在任何现有的库或更好的方法可以无缝转换entitiesmodel.

abstract class Mapper<E, D> {
  D mapFromEntity(E type);

  E mapToEntity(D type);
}
Run Code Online (Sandbox Code Playgroud)

实体到模型的关系

isl*_*rov 1

如果您从 . 扩展,您可以轻松地从 转换model为。因为,对于这种情况,您实际上不需要映射器。您在初始化时传递字段。entitymodelentitysuper()

class UserEntity {
  final String id;
  final String name;
  final String surname;
  final String? avatarImage;

  UserEntity({required this.id, required this.name, required this.surname, this.avatarImage});

  
}
Run Code Online (Sandbox Code Playgroud)
class UserModel extends UserEntity {
  UserModel({
    required String id,
    required String name,
    required String surname,
    String? avatarImage,
  }) : super(name: name, id: id, surname: surname, avatarImage: avatarImage);
  Map<String, dynamic> toMap() {
    return {
      'id': this.id,
      'name': this.name,
      'surname': this.surname,
      'avatarImage': this.avatarImage,
    };
  }

  factory UserModel.fromMap(Map<String, dynamic> map) {
    return UserModel(
      id: map['id'] as String,
      name: map['name'] as String,
      surname: map['surname'] as String,
      avatarImage: map['avatarImage'] as String,
    );
  }
}

Run Code Online (Sandbox Code Playgroud)
final UserEntity user=UserModel.fromJson(someMap);
Run Code Online (Sandbox Code Playgroud)

Ps 您还可以看到Converter<S,T>用于映射的预制抽象类

  • 问题不是将模型转换为实体,而是将“实体”转换为“模型”。例如,对于传出请求。 (2认同)