В этом примере я буду использовать 2 файла (LogService и LoggedConflictException).
Я бы хотел внедрить LogService в класс LoggedConflictException, а не передавать его через конструктор или метод LoggedConflictException. Вот что я делаю сейчас (и мне это совсем не нравится):
export class LoggedConflictException extends ConflictException {
constructor( logService: LogService, options?: {
purpose?: string,
credentials?: any,
message?: string | object | any,
error?: string
} ) {
super( options.message );
// the fact that I have to pass logService instance every time does make me worry.
// I would like to inject logService directly without the need to pass it down from other classes.
logService.createLog( options.purpose, options.message, options.credentials, options.error );
}
}
И вот как я передаю экземпляр logService с моего контроллера:
@Controller('auth')
export class AuthController {
constructor( private logService: LogService ) {}
@Post( '/test' )
test(): Promise<any> {
const options = {
purpose: LOG_PURPOSE.TEST,
message: EXCEPTION_MESSAGE.TEST_MESSAGE
};
throw new LoggedConflictException( this.logService, options ); // <- I don't like to pass this.logService every time when I want to log and throw an exception!
// instead I want to have a code that looks like this:
throw new LoggedConflictException( options );
}
}
Я надеюсь, что мой вопрос имеет смысл, и что кто-то может помочь любому человеку, который изо всех сил пытается получить чистый код, такой же как я.