This guide will help you create your first Nest Dart application from scratch. We'll build a simple user management system to demonstrate the core concepts.
Installation
Add the appropriate Nest Dart packages to your pubspec.yaml:
Check pub.dev for the latest versions of Nest Dart packages before adding them to your project.
// lib/app_module.dartimport 'package:nest_core/nest_core.dart';import 'modules/core_module.dart';class AppModule extends Module { @override List<Module> get imports => [CoreModule()]; @override void providers(Locator locator) { // App-level services go here }}
Initialize the Application
Code
// lib/main.dartimport 'package:nest_core/nest_core.dart';import 'app_module.dart';void main() async { // Create and initialize the container final container = ApplicationContainer(); await container.registerModule(AppModule()); // Use services final logger = container.get<LoggerService>(); logger.log('Application started successfully!');}
Adding More Services
Let's expand our example with a user service:
Create User Model
Code
// lib/models/user.dartclass User { final int id; final String name; final String email; const User({ required this.id, required this.name, required this.email, }); Map<String, dynamic> toJson() => { 'id': id, 'name': name, 'email': email, };}
Create User Repository
Code
// lib/repositories/user_repository.dartimport '../models/user.dart';import '../services/logger_service.dart';class UserRepository { final LoggerService _logger; final List<User> _users = []; UserRepository(this._logger); List<User> findAll() { _logger.log('Finding all users'); return List.unmodifiable(_users); } User? findById(int id) { _logger.log('Finding user by id: $id'); return _users.where((user) => user.id == id).firstOrNull; } User create(String name, String email) { _logger.log('Creating user: $name'); final user = User( id: _users.length + 1, name: name, email: email, ); _users.add(user); return user; }}
Create User Service
Code
// lib/services/user_service.dartimport '../models/user.dart';import '../repositories/user_repository.dart';import '../services/logger_service.dart';class UserService { final UserRepository _repository; final LoggerService _logger; UserService(this._repository, this._logger); List<User> getAllUsers() { _logger.log('UserService: Getting all users'); return _repository.findAll(); } User? getUserById(int id) { _logger.log('UserService: Getting user by id: $id'); return _repository.findById(id); } User createUser(String name, String email) { _logger.log('UserService: Creating user: $name'); return _repository.create(name, email); }}
Create User Module
Code
// lib/modules/user_module.dartimport 'package:nest_core/nest_core.dart';import '../services/user_service.dart';import '../repositories/user_repository.dart';import 'core_module.dart';class UserModule extends Module { @override List<Module> get imports => [CoreModule()]; @override void providers(Locator locator) { // Register repository first locator.registerSingleton<UserRepository>( UserRepository(locator.get<LoggerService>()), ); // Register service that depends on repository locator.registerSingleton<UserService>( UserService( locator.get<UserRepository>(), locator.get<LoggerService>(), ), ); } @override List<Type> get exports => [UserService];}
Update App Module
Code
// lib/app_module.dartimport 'package:nest_core/nest_core.dart';import 'modules/core_module.dart';import 'modules/user_module.dart';class AppModule extends Module { @override List<Module> get imports => [CoreModule(), UserModule()]; @override void providers(Locator locator) { // App-level services go here }}
Use the Services
Code
// lib/main.dartimport 'package:nest_core/nest_core.dart';import 'app_module.dart';void main() async { // Initialize container final container = ApplicationContainer(); await container.registerModule(AppModule()); // Get services final userService = container.get<UserService>(); // Create some users final alice = userService.createUser('Alice', 'alice@example.com'); final bob = userService.createUser('Bob', 'bob@example.com'); // Get all users final users = userService.getAllUsers(); print('All users: ${users.map((u) => u.toJson()).toList()}'); // Get specific user final user = userService.getUserById(1); print('User 1: ${user?.toJson()}');}
Service Registration Types
Nest Dart supports different service registration patterns: