sure, I’m seeing how migrating from tsyringe goes, in tsyringe there’s a lot of this, essentially they made a helper method around caching your factories if you want it (note: in this case I’ve already written an API compatibility layer for Aurelia, that’s why those imports aren’t coming from tsyringe.) We have code all over the place that uses factories mostly because of 3rd party code like typeorm, winston, etc, and most of those objects we ultimately don’t need/want more than one instance.
import { LoggingWinston } from '@google-cloud/logging-winston';
import winston, { format, Logger, LoggerOptions, transports } from 'winston';
import { instanceCachingFactory, registry } from '../injection/injectionutils';
export const LoggerDefault = 'defaultLogger';
export const LoggerTypeOrm = 'typeormLogger';
export const LoggerSecurity = 'securityLogger';
export const LoggerSecurityChild = 'childSecurityLogger';
@registry([
{ token: LoggerDefault, useFactory: instanceCachingFactory(createDefaultLogger) },
{ token: LoggerTypeOrm, useFactory: instanceCachingFactory(createTypeOrmLogger) },
{ token: LoggerSecurity, useFactory: instanceCachingFactory(createSecurityLogger) },
])
export class LoggerProvider {}
export function createDefaultLogger(): Logger {
const config: LoggerOptions =
process.env['NODE_ENV'] === 'development' ? devConfig() : serverConfig();
return winston.loggers.add(LoggerDefault, config);
}
function createTypeOrmLogger(): Logger {
const config: LoggerOptions =
process.env['NODE_ENV'] === 'development' ? devConfig() : serverConfig();
return winston.loggers.add(LoggerTypeOrm, config);
}
function createSecurityLogger(): Logger {
const config: LoggerOptions =
process.env['NODE_ENV'] === 'development' ? devConfig() : googleConfig();
return winston.loggers.add(LoggerSecurity, config);
}
function devConfig(): LoggerOptions {
const console = new transports.Console({
level: process.env.LOG_LEVEL || 'info',
debugStdout: true,
format: format.combine(format.cli(), format.splat(), format.simple()),
});
return {
transports: [console],
exceptionHandlers: [console],
};
}
function googleConfig(): LoggerOptions {
return {
transports: [
new LoggingWinston({
projectId: process.env.GOOGLE_SERVICE_ACCOUNT_PROJECT_ID,
credentials: {
client_email: process.env.GOOGLE_SERVICE_ACCOUNT_CLIENT_EMAIL!,
private_key: process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY!,
},
}),
],
};
}
function serverConfig(): LoggerOptions {
return {
transports: [
new transports.Console({
level: process.env.LOG_LEVEL || 'info',
debugStdout: true,
format: format.combine(format.splat(), format.simple()),
}),
],
};
}