Skip to content

Name Collision Example

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
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();
}
}
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();
}
}
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 resolves name collisions by using file paths to create unique identifiers:

IoC Arise uses the following strategy to resolve name collisions:

  1. Directory-based Prefixing: Classes get prefixed with their directory name

    • user/ListItemsUseCase.tsUserListItemsUseCase
    • product/ListItemsUseCase.tsProductListItemsUseCase
    • order/ListItemsUseCase.tsOrderListItemsUseCase
  2. 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';
  3. Type-Safe Access: Full TypeScript support with proper typing

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 { /* ... */ }
}
};
{
"srcDir": ".",
"outputFile": "container.gen.ts"
}