Изучение
Начало работы
Создание типизированного DataSourceContainer и Repository, публикующего доменные данные.
v0.1.0-dev.1Начальный уровеньark_data_layer
Начало работы
Установка
shell
dart pub add ark_data_layer
Контракт источника
dart
abstract interface class UserRemoteDataSource implements DataSource {
Future<List<UserDto>> fetchUsers();
}
DataSource — маркерный интерфейс. Приложение определяет полезный контракт и ограничивает его одной технической ответственностью.
Реализация Repository
dart
final class UserRepositoryImpl extends Repository<UsersData>
implements UserRepository {
UserRepositoryImpl({required super.dataSources})
: _remote = dataSources.get<UserRemoteDataSource>(),
super(initialData: const UsersData.empty());
final UserRemoteDataSource _remote;
@override
Future<void> refresh() async {
final records = await _remote.fetchUsers();
setData(UsersData(records.map(mapUser)));
}
}
Конкретный класс расширяет базовый класс пакета и реализует доменный интерфейс приложения. Вызывающий код зависит от UserRepository, а не от DataSourceContainer.
Композиция и закрытие
dart
final repository = UserRepositoryImpl(
dataSources: DataSourceContainer(<DataSource>[remoteSource]),
);
await repository.refresh();
await repository.close();
await remoteSource.close();
Repository закрывает собственный механизм публикации, но не закрывает DataSource, которым владеет внешний Scope.