Logowiretap Documentation

Design Patterns

Apply classic design patterns using wiretap

Dependency Inversion#

Decouple high-level modules from low-level implementations.

final databaseToken = provide<Database>();
final userServiceToken = provide<UserService>((inject) =>
  UserServiceImpl(inject(databaseToken))
);

Strategy#

Swap behavior per environment using provider overrides.

final paymentProcessorToken = provide<PaymentProcessor>();

final prod = WiretapContext(providers: [
  paymentProcessorToken.provideOverride((_) => StripeProcessor()),
]);

final test = WiretapContext(providers: [
  paymentProcessorToken.provideOverride((_) => MockProcessor()),
]);

Service Locator#

Centralize service discovery via a composed context.

final serviceLocator = WiretapContext(providers: [
  loggerToken.provideOverride((_) => FileLogger()),
  cacheToken.provideOverride((_) => RedisCache()),
  configToken.provideOverride((_) => AppConfig.fromEnvironment()),
]).inject;

Aggregated Strategy (Plugins)#

Collect multiple implementations for plugin architectures.

final pluginToken = provideCollection<Plugin>();
final context = WiretapContext(providers: [
  pluginToken.provideAdditional((_) => [AuthPlugin(), LoggingPlugin()]),
  pluginToken.provideAdditional((_) => [MetricsPlugin()]),
]);

final plugins = context.inject(pluginToken);

Next: Learn how to test with mocks in Testing & Mocks.