Let’s add a new command for logging in to the ATM:
final class LoginCommand extends SingleArgCommand {
private final Outputter outputter;
@Inject
LoginCommand(Outputter outputter) {
this.outputter = outputter;
}
@Override
public String key() {
return "login";
}
@Override
public Result handleArg(String username) {
outputter.output(username + " is logged in.");
return Result.handled();
}
}
(The abstract SingleArgCommand we’re using for simplicity is defined
here).
We can create a LoginCommandModule like our HelloWorldModule to bind
LoginCommand as a Command:
@Module
abstract class LoginCommandModule {
@Binds
abstract Command loginCommand(LoginCommand command);
}
To start using the LoginCommand in CommandRouter, we’ll replace
HelloWorldModule in the @Component annotation with LoginCommandModule.
@Component(modules = {LoginCommandModule.class, SystemOutModule.class})
interface CommandRouterFactory {
CommandRouter router();
}
Run the application and try to log in by typing login <your
name>.
This begins to show some of the benefits of using Dagger. With a one line
declarative change, we were able to change what Command was received by
CommandRouter. CommandRouter had no changes, it just worked. Using this
approach, you can write many different versions of your application and reuse
code without massive changes.