import {
Container,
BrushyDIProvider,
resolve,
inject,
cache,
monitor,
} from "@brushy/di";
// Tokens
const LOGGER = Symbol("LOGGER");
const API_CLIENT = Symbol("API_CLIENT");
const USER_SERVICE = Symbol("USER_SERVICE");
// Classes
class Logger {
log(message: string) {
console.log(`[LOG] ${message}`);
}
}
class ApiClient {
constructor(private baseUrl: string) {}
async get(path: string) {
return fetch(`${this.baseUrl}${path}`).then((r) => r.json());
}
}
class UserService {
constructor(
private apiClient: ApiClient,
private logger: Logger,
) {}
async getUsers() {
this.logger.log("Fetching users");
return this.apiClient.get("/users");
}
}
// Create container
const container = new Container();
// Register dependencies
container.register(LOGGER, { useClass: Logger });
container.register(API_CLIENT, {
useFactory: () => new ApiClient("https://api.example.com"),
lifecycle: "singleton",
});
container.register(USER_SERVICE, {
useClass: UserService,
dependencies: [API_CLIENT, LOGGER],
});
// Configure global container
inject.setGlobalContainer(container);
// Create monitor
const containerMonitor = monitor.create(container, {
eventTypes: ["all"],
logToConsole: true,
});
// Function that uses global resolution
async function fetchUsers() {
try {
const userService = resolve<UserService>(USER_SERVICE);
return await userService.getUsers();
} catch (error) {
console.error("Failed to fetch users:", error);
return [];
} finally {
// Clear cache after use
cache.clear(USER_SERVICE);
}
}
// React Component
function UserList() {
const [users, setUsers] = useState([]);
}