这是一个什么是最佳实践的问题。
我正在使用颤振构建一个应用程序,我有以下要求。
我有本地(安装在设备上)和远程(安装在服务器上)数据库。
我必须为本地数据库构建存储库。我有很多选择(SQLITE、Hive 等)。我必须保持数据库的选择与应用程序(存储库模式)松散耦合。
我必须使用 BLOC 模式进行状态管理。
我苦苦挣扎的一点是,对于每种类型的数据库,实体模型(我来自实体框架背景,因此称它为实体模型。我不知道你怎么称呼它)是不同的。
例如,
SQLLite (Moor) 的模型如下所示
class ToDosSqlLite extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(min: 6, max: 32)();
}
Hive 的模型如下所示。
class ToDosHive extends HiveObject {
final int id;
final String title;
Person(this.id, this.title);
}
对于任何其他选择的数据库,模型看起来会有所不同。
我有如下的存储库类。
abstract class LocalToDoRepository{
List<What should be the type here?> getAll();
}
class SqlLiteToDoRepository extends LocalToDoRepository{
///overriding won't work here as Type is different from the base class method
@override
List<ToDosSqlLite> getAll(){///implementation}
}
class HiveToDoRepository extends LocalToDoRepository{
///overriding won't work here as Type is different from the base class method
@override
List<ToDosHive> getAll(){///implementation}
}
在 SqlLiteToDoRepository 中,getAll()
方法返回 a List<ToDosSqlLite>
,在 HiveToDoRepository 中,相同的方法返回 a List<ToDosHive>
。
下面是我的集团
class ToDoBloc extends Bloc<ToDoEvent, ToDoState>{
final LocalToDoRepository localToDoRepository;
///localToDoRepository object is dependency injected . If I want to use SQLite, I will inject
///SqlLiteToDoRepository and so on.
ToDoBloc ({@required this.localToDoRepository}): super(ToDoInitialState());
}
我如何以优雅的方式进行这种抽象?如果您有任何想法,请提出建议。
提前致谢。