Visualizer Examples
This page provides examples of using the Diblob Visualizer in different scenarios.
Example Container Setup
The visualizer includes a reusable example container setup that demonstrates common DI patterns.
Location
All example code is located in packages/diblob-visualizer/src/examples/sample-container.ts
What's Included
Interfaces:
Logger- Logging serviceDatabase- Database accessCache- Caching serviceUserService- User managementEmailService- Email sendingNotificationService- Notification systemMetricsService- Event tracking
Implementations:
ConsoleLogger- Simple console-based loggerInMemoryDatabase- Mock databaseMemoryCache- In-memory cache (transient lifecycle)UserServiceImpl- User service with logger, database, and cache dependenciesEmailServiceImpl- Email service with logger dependencyNotificationServiceImpl- Notification service with user, email, and logger dependenciesMetricsServiceImpl- Metrics service with logger dependency
Usage Examples
Create a Sample Container
typescript
import { createSampleContainer } from './examples/sample-container.js';
const container = createSampleContainer();This creates a container with 6 services:
- Logger (singleton)
- Database (singleton)
- Cache (transient)
- UserService (singleton, depends on logger, database, cache)
- EmailService (singleton, depends on logger)
- NotificationService (singleton, depends on userService, emailService, logger)
Add Metrics Service
typescript
import { addMetricsService } from './examples/sample-container.js';
addMetricsService(container);This adds a MetricsService to the container.
Get Blobs for Re-registration
typescript
import { getLoggerBlob, getLoggerImpl } from './examples/sample-container.js';
const logger = getLoggerBlob();
const ConsoleLogger = getLoggerImpl();
// Re-register to trigger updates
container.register(logger, ConsoleLogger);Complete Example
Here's a complete example showing how to set up a container with metadata and visualize it:
typescript
import { createBlob, createContainer } from '@speajus/diblob';
// Define interfaces
interface Logger {
log(message: string): void;
}
interface Database {
query(sql: string): unknown[];
}
interface UserService {
getUser(id: number): { id: number; name: string };
createUser(name: string): { id: number; name: string };
}
// Create blobs with metadata
const logger = createBlob<Logger>('logger', {
name: 'Console Logger',
description: 'Logs messages to the console',
category: 'infrastructure',
version: '1.0.0'
});
const database = createBlob<Database>('database', {
name: 'In-Memory Database',
description: 'Simple in-memory database for testing',
category: 'infrastructure',
version: '1.0.0'
});
const userService = createBlob<UserService>('userService', {
name: 'User Service',
description: 'Manages user data and operations',
category: 'business',
version: '2.1.0',
author: 'Development Team'
});
// Implementations
class ConsoleLogger implements Logger {
log(message: string) {
console.log(`[LOG] ${message}`);
}
}
class InMemoryDatabase implements Database {
private data: Map<string, unknown[]> = new Map();
query(sql: string): unknown[] {
console.log(`[DB] Executing: ${sql}`);
return this.data.get(sql) || [];
}
}
class UserServiceImpl implements UserService {
private users: Map<number, { id: number; name: string }> = new Map();
private nextId = 1;
constructor(
private logger: Logger,
private database: Database
) {}
getUser(id: number) {
this.logger.log(`Getting user ${id}`);
this.database.query(`SELECT * FROM users WHERE id = ${id}`);
return this.users.get(id) || { id: 0, name: 'Unknown' };
}
createUser(name: string) {
const user = { id: this.nextId++, name };
this.users.set(user.id, user);
this.logger.log(`Created user: ${name}`);
this.database.query(`INSERT INTO users VALUES (${user.id}, '${name}')`);
return user;
}
}
// Create container with metadata
const container = createContainer({
name: 'Application Container',
description: 'Main DI container for the application',
environment: 'development',
created: new Date().toISOString()
});
// Register services
container.register(logger, ConsoleLogger);
container.register(database, InMemoryDatabase);
container.register(userService, UserServiceImpl, logger, database);Then visualize it:
svelte
<script lang="ts">
import { DiblobVisualizer } from '@speajus/diblob-visualizer';
import { container } from './container';
</script>
<DiblobVisualizer {container} autoRefresh={true} />Used By
src/App.svelte- Demo application (local mode)example-server.ts- Example server for remote visualization
Benefits
- DRY Principle - Example code is defined once and reused
- Consistency - Both local and remote demos use the same setup
- Maintainability - Changes to examples only need to be made in one place
- Clean Separation - Demo code is separate from component code