CodeBlanks Logo Icon CodeBlanks

Architecture

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

main.dart
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

main.dart
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ı

Soru
container.____('math', svc);
Cevap
container.register('math', svc);

Açıklama: register ile bir servis kapsayıcıya kaydedilir.

Uzman bölümündeki tüm dersler