Architecture
- Dart kursu
- Uzman
- Ders 46/47
- 6 dk
Clean architecture ile katmanları birleştirirsin.
Architecture
Şimdi mimari katmanlarını ekleyeceğiz: bir MathRepository (veri erişim soyutu) ve bir ServiceContainer (DI kapsayıcısı). Bu, clean architecture + repository + DI desenlerini birleştirir.
MathRepository, bir MathService alır ve sum metodu sunar. ServiceContainer, servisleri register ile kaydeder, resolve<T> ile çözer.
Bu katmanlar, main'in somut sınıflara değil arayüzlere bağımlı olmasını sağlar. Testte sahte servis enjekte edilir; üretimde native servis. Aynı repository her ikisinde de çalışır.
Repository + DI birlikte
MathRepository, MathService arayüzüne bağımlıdır. ServiceContainer'dan çözülen servis repository'ye verilir. Bu, dependency inversion ilkesinin somut uygulamasıdır.
Akış: container.register('math', NativeMathService(...)) → container.resolve<MathService>('math') → MathRepository(service) → repo.sum(4, 6).
Bu zincir, somut sınıfı yalnızca bir yerde (register) bilir. Geri kalan tüm kod arayüzle çalışır. Testte MockMathService kaydedilir; diğer kod değişmez.
Uygulama MathRepository ve ServiceContainer ekle
Aşağıdaki kodda BindingGenerator zaten tanımlı. Şimdi bir class MathRepository tanımla: final MathService service; MathRepository(this.service); int sum(int a, int b) => service.add(a, b);. Bir class ServiceContainer tanımla: final Map<String, dynamic> _services = {}; void register(String key, dynamic service) => _services[key] = service; T resolve<T>(String key) => _services[key] as T;. main içinde final container = ServiceContainer(); yarat; container.register('math', NativeMathService('native_add')); çağır; final repo = MathRepository(container.resolve<NativeMathService>('math')); ve print('repo: ${repo.sum(4, 6)}'); ekle.
Başlangıç kodu
import 'dart:ffi';
abstract class MathService {
int add(int a, int b);
}
typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);
class NativeMathService implements MathService {
final String bindingName;
NativeMathService(this.bindingName);
@override
int add(int a, int b) => a + b;
String describe() => 'native: $bindingName';
}
class NativeBinding {
final String name;
const NativeBinding(this.name);
}
class BindingGenerator {
String generate(String className) => '// generated binding for $className';
}
// MathRepository sınıfını tanımla (servis alanı, sum metodu)
// ServiceContainer sınıfını tanımla (register, resolve metotları)
void main() {
print('servis hazır');
final svc = NativeMathService('native_add');
print(svc.describe());
print('sonuç: ${svc.add(2, 3)}');
final gen = BindingGenerator();
print(gen.generate('NativeMathService'));
// bir container yarat; servis kaydet; repo ile sum yazdır
}Örnek çözüm
import 'dart:ffi';
abstract class MathService {
int add(int a, int b);
}
typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);
class NativeMathService implements MathService {
final String bindingName;
NativeMathService(this.bindingName);
@override
int add(int a, int b) => a + b;
String describe() => 'native: $bindingName';
}
class NativeBinding {
final String name;
const NativeBinding(this.name);
}
class BindingGenerator {
String generate(String className) => '// generated binding for $className';
}
class MathRepository {
final MathService service;
MathRepository(this.service);
int sum(int a, int b) => service.add(a, b);
}
class ServiceContainer {
final Map<String, dynamic> _services = {};
void register(String key, dynamic service) => _services[key] = service;
T resolve<T>(String key) => _services[key] as T;
}
void main() {
print('servis hazır');
final svc = NativeMathService('native_add');
print(svc.describe());
print('sonuç: ${svc.add(2, 3)}');
final gen = BindingGenerator();
print(gen.generate('NativeMathService'));
final container = ServiceContainer();
container.register('math', NativeMathService('native_add'));
final repo = MathRepository(container.resolve<NativeMathService>('math'));
print('repo: ${repo.sum(4, 6)}');
}Beklenen çıktı
servis hazır native: native_add sonuç: 5 // generated binding for NativeMathService repo: 10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Mimari parçaları eşleştir
| Kavram | Anlamı |
|---|---|
MathRepository |
Veri erişim |
ServiceContainer |
DI kapsayıcı |
register |
Kayıt metodu |
resolve<T> |
Çözme metodu |
2 ServiceContainer ne işe yarar?
- Dosya açar
- Ağ dinler
- Servisleri kaydeder ve çözer Doğru cevap
- Test çalıştırır
Açıklama: ServiceContainer register ile kaydeder, resolve ile çözer.
3 register çağrısı
container.____('math', svc);
container.register('math', svc);
Açıklama: register ile bir servis kapsayıcıya kaydedilir.