Service Container
Flowra menggunakan container ringan yang mendukung function, value, dan resolver gaya Awilix. Ini menjaga dependency resolution tetap eksplisit dan mudah dites.
Cara kerja
container.register(name, factory)mendaftarkan dependency.- Dependency singleton secara default kecuali diubah.
container.createScope(prefix)membuat scope bernama untuk modul.- Scope bisa mendaftarkan objek bertingkat, lalu diakses sebagai dot-notation keys.
Scope modul
Modul didaftarkan di namespace modules.<name>. Contoh modul Users:
app/Modules/Users/users.container.js
const { asClass, asValue } = require('awilix');
const UsersService = require('./Users.service');
const UsersController = require('./Users.controller');
const registerUsersRoutes = require('./users.routes');
module.exports = (scope) => {
scope.register({
services: {
main: asClass(UsersService).singleton(),
},
controllers: {
main: asClass(UsersController).singleton(),
},
routes: asValue(registerUsersRoutes),
});
scope.registerAlias('usersController', 'controllers.main');
};
Container mengekspose ini dengan dot notation:
const controller = container.resolve('modules.users.controllers.main');
Highlight API container
register()menerima string + factory atau objek bertingkat.resolve()akan error jika dependency tidak ditemukan.createScope()membuat accessor grup sepertimodules.users.services.cradlemenyediakan proxy yang nyaman untuk dependency yang sudah di-resolve.
Testing
Karena dependency eksplisit, Anda bisa mengganti implementasi dengan mock di scope test.