Skip to content

Instantly share code, notes, and snippets.

@machinescream
Last active March 23, 2022 12:49
Show Gist options
  • Save machinescream/2f95cfd25d36b3343cf1ab8b3494fd78 to your computer and use it in GitHub Desktop.
Save machinescream/2f95cfd25d36b3343cf1ab8b3494fd78 to your computer and use it in GitHub Desktop.
OOD design architecture example (no DI container)
/// Data layer
// api
enum Mode {
mock,
stage
}
abstract class FireBaseApi {
factory FireBaseApi(Mode mode) {
switch (mode) {
case Mode.mock:
return FireBaseApi.mock();
case Mode.stage:
return FireBaseApi.stage();
}
return FireBaseApi.mock();
}
factory FireBaseApi.stage() => _FireBaseApi();
factory FireBaseApi.mock() => _MockApi();
Stream<List<UserDTO>> users();
}
class _FireBaseApi implements FireBaseApi {
@override
Stream<List<UserDTO>> users() {
return Firestore.instance.collection('users').snapshots().map((snapshot) {
return snapshot.documents.map((document) {
final data = document.data;
return UserDTO()
..photoUrl = data['photoUrl']
..nickname = data['nickname']
..rating = data['rating']
..age = data['age']
..description = data['description']
..height = data['height']
..weight = data['weight']
}).toList();
});
}
}
class _MockApi implements FireBaseApi {
@override
Stream<List<UserDTO>> users() => Stream.value([]);
}
//repository
class UsersDataRepository implements UsersDomainRepository {
final FireBaseApi api;
UsersDataRepository(this.api);
@override
Stream<List<UserModel>> users() {
//UserDto to UserModel code
return api.users();
}
}
/// Domain layer
// repository
abstract class UsersDomainRepository {
Stream<List<UserModel>> users();
factory UsersDomainRepository.fireCloud() =>
_UsersDomainRepository(UsersDataRepository(FireBaseApi(Mode.mock)));
}
class _UsersDomainRepository implements UsersDomainRepository {
final UsersDataRepository repository;
const _UsersDomainRepository(this.repository);
@override
Stream<List<UserModel>> users() => repository.users();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment