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 Required
abstraction?: 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);