Skip to content

Comparisons

Compare udic with other DI libraries.

Use and inject one dependency.

  • Bundle size: 473B
  • Minified size: 215B
  • Gzipped size: 177B
import * as di from 'udic';
const random = di.service('random')<() => number>();
const main = di.use([random], (random) => {
console.log('Random number:', random());
});
main({ random: Math.random });

Use and inject dependencies in different function layers.

  • Bundle size: 1.1KB
  • Minified size: 534B
  • Gzipped size: 351B
import * as di from 'udic';
const logger = di.service('logger')<{
info: (msg: string) => void;
}>();
const createId = di.service('createId')<() => string>();
interface User {
readonly name: string;
readonly id: string;
readonly credits: number;
}
// Functions that requires dependencies to run
const createUser = di.use(
[createId, logger],
(createId, logger) =>
(name: string): User => {
const id = createId();
logger.info(`User created: id="${id}", name="${name}"`);
return { name, id, credits: 0 };
},
);
const giveUserCredits = di.use(
[logger],
(logger) => (user: User, credits: number) => {
// @ts-ignore
user.credits += credits;
logger.info(
`User credits: id="${user.id}", increased-credits=${credits}, current-credits=${user.credits}`,
);
},
);
// Main program
const main = di.use(
[createUser, giveUserCredits],
(createUser, giveUserCredits) => {
const user = createUser('reve');
giveUserCredits(user, 10);
},
);
main({
logger: {
info: (msg) => console.info('[INFO]', msg),
},
createId: () => '' + Math.round(Math.random() * 1e6),
});

Use and inject 3 dependencies, with log depends on config and db depends on both log and config.

  • Bundle size: 1.15KB
  • Minified size: 606B
  • Gzipped size: 414B
import * as di from 'udic';
// Declarations
const config = di.service('config')<{
logLevel: string;
connection: string;
}>();
const log = di.service('log')<(msg: string) => void>();
const db = di.service('db')<{
query: (sql: string) => { result: string };
}>();
const main = di.use([db, log], (db, log) => {
log(db.query('SELECT * FROM users').result);
});
// Implementations
const logImpl = di.impl(
log,
di.use([config], (config) => (msg) => {
console.log(`[${config.logLevel}] ${msg}`);
}),
);
const dbImpl = di.impl(
db,
di.use([config, log], (config, log) => ({
query(sql) {
log('Executing query: ' + sql);
return { result: 'Results from ' + config.connection };
},
})),
);
// Link dependencies
const logDeps = di.link([logImpl], {
config: {
logLevel: 'INFO',
connection: 'mysql://username:password@hostname:port/database_name',
},
});
const dbDeps = di.link([dbImpl], logDeps);
// Run with linked dependencies
main(dbDeps);