forRootAsync() accepts an options object that mirrors the custom provider API — supporting useFactory, useClass, or useExisting. The caller provides a factory function that receives injected providers as arguments, and the dynamic module wires them into the provider token that the module's services depend on.
The options object mirrors the NestJS provider API — useFactory, useClass, useExisting are all valid.
Pass imports and inject from the caller's options into the dynamic module's returned object.
The factory receives resolved provider instances as arguments in the order listed in inject.
This is the exact pattern used by @nestjs/config, @nestjs/typeorm, and @nestjs/jwt.