Modules
Modules help you organize your application into cohesive blocks. Each module can register controllers, services, and include other sub-modules.
Creating a Module
user.module.ts TypeScript
import { Module } from '@abrahambass/nova';
import { UserController } from './user.controller';
import { UserService } from './user.service';
export const UserModule = new Module()
.registerController(UserController)
.registerSingleton(UserService); Module Methods
| Method | Parameters | Description |
|---|---|---|
registerController(controller) | controller: Constructor Required | Registers a controller class to be included when the module is loaded. |
registerSingleton(impl, abstraction?) | impl: Constructor Requiredabstraction?: AbstractConstructor Optional | Registers a service as a singleton in the DI container. |
include(module) | module: Module Required | Includes a sub-module. Its controllers and services are registered recursively. |
Nesting Modules
You can nest modules to create a modular architecture:
app.module.ts TypeScript
import { Module } from '@abrahambass/nova';
import { UserModule } from './users/user.module';
import { ProductModule } from './products/product.module';
import { OrderModule } from './orders/order.module';
export const AppModule = new Module()
.include(UserModule)
.include(ProductModule)
.include(OrderModule); Service Registration with Abstraction
You can bind an implementation to an abstract class for interface-based DI:
user.module.ts TypeScript
import { Module } from '@abrahambass/nova';
abstract class IUserRepository {
abstract findAll(): Promise<User[]>;
}
class PostgresUserRepository extends IUserRepository {
async findAll() {
// database query...
return [];
}
}
export const UserModule = new Module()
.registerSingleton(PostgresUserRepository, IUserRepository); Using a Module
main.ts TypeScript
const app = await NovaFactory.create();
app.include(AppModule);
await app.listen(3000);