Name Collision Example
Project Structure
Section titled “Project Structure”name-collision-example/├── user/│ ├── CreateItemUseCase.ts│ ├── DeleteItemUseCase.ts│ ├── GetItemUseCase.ts│ ├── ListItemsUseCase.ts│ ├── UpdateItemUseCase.ts│ ├── UserController.ts│ └── UserRepository.ts├── product/│ ├── CreateItemUseCase.ts│ ├── DeleteItemUseCase.ts│ ├── GetItemUseCase.ts│ ├── ListItemsUseCase.ts│ ├── UpdateItemUseCase.ts│ ├── ProductController.ts│ └── ProductRepository.ts├── order/│ ├── CreateItemUseCase.ts│ ├── DeleteItemUseCase.ts│ ├── GetItemUseCase.ts│ ├── ListItemsUseCase.ts│ ├── UpdateItemUseCase.ts│ ├── OrderController.ts│ └── OrderRepository.ts├── ioc.config.json└── container.gen.ts
User Domain
Section titled “User Domain”export class ListItemsUseCase { constructor(private userRepository: IUserRepository) {}
async execute(): Promise<{ id: string; name: string; description: string }[]> { console.log('Listing all user items'); return await this.userRepository.listUserItems(); }}
Product Domain
Section titled “Product Domain”export class ListItemsUseCase { constructor(private productRepository: IProductRepository) {}
async execute(): Promise<{ id: string; name: string; price: number; category: string }[]> { console.log('Listing all product items'); return await this.productRepository.listProducts(); }}
Order Domain
Section titled “Order Domain”export class ListItemsUseCase { constructor(private orderRepository: IOrderRepository) {}
async execute(): Promise<{ id: string; orderId: string; status: string }[]> { console.log('Listing all order items'); return await this.orderRepository.listOrders(); }}
IoC Arise’s Solution
Section titled “IoC Arise’s Solution”IoC Arise resolves name collisions by using file paths to create unique identifiers:
Name Resolution Strategy
Section titled “Name Resolution Strategy”IoC Arise uses the following strategy to resolve name collisions:
-
Directory-based Prefixing: Classes get prefixed with their directory name
user/ListItemsUseCase.ts
→UserListItemsUseCase
product/ListItemsUseCase.ts
→ProductListItemsUseCase
order/ListItemsUseCase.ts
→OrderListItemsUseCase
-
Unique Import Aliases: Generated imports use unique aliases
import { ListItemsUseCase as UserListItemsUseCase } from './user/ListItemsUseCase';import { ListItemsUseCase as ProductListItemsUseCase } from './product/ListItemsUseCase';import { ListItemsUseCase as OrderListItemsUseCase } from './order/ListItemsUseCase'; -
Type-Safe Access: Full TypeScript support with proper typing
Generated Container Structure
Section titled “Generated Container Structure”export const container = { coreModule: { // User domain classes (no prefix for first occurrence) get CreateItemUseCase(): CreateItemUseCase { /* ... */ }, get DeleteItemUseCase(): DeleteItemUseCase { /* ... */ }, get GetItemUseCase(): GetItemUseCase { /* ... */ }, get ListItemsUseCase(): ListItemsUseCase { /* ... */ }, get UpdateItemUseCase(): UpdateItemUseCase { /* ... */ }, get UserController(): UserController { /* ... */ }, get UserRepository(): UserRepository { /* ... */ },
// Product domain classes (prefixed to avoid collision) get ProductCreateItemUseCase(): ProductCreateItemUseCase { /* ... */ }, get ProductDeleteItemUseCase(): ProductDeleteItemUseCase { /* ... */ }, get ProductGetItemUseCase(): ProductGetItemUseCase { /* ... */ }, get ProductListItemsUseCase(): ProductListItemsUseCase { /* ... */ }, get ProductUpdateItemUseCase(): ProductUpdateItemUseCase { /* ... */ }, get ProductController(): ProductController { /* ... */ }, get ProductRepository(): ProductRepository { /* ... */ },
// Order domain classes (prefixed to avoid collision) get OrderCreateItemUseCase(): OrderCreateItemUseCase { /* ... */ }, get OrderDeleteItemUseCase(): OrderDeleteItemUseCase { /* ... */ }, get OrderGetItemUseCase(): OrderGetItemUseCase { /* ... */ }, get OrderListItemsUseCase(): OrderListItemsUseCase { /* ... */ }, get OrderUpdateItemUseCase(): OrderUpdateItemUseCase { /* ... */ }, get OrderController(): OrderController { /* ... */ }, get OrderRepository(): OrderRepository { /* ... */ } }};
Configuration
Section titled “Configuration”{ "srcDir": ".", "outputFile": "container.gen.ts"}