我有一个Context类,它是一个在运行时逐渐填充的键值对。
我想创建需要上下文中某些值的对象实例。
例如:
public interface Task
{
void execute();
}
public interface UiService
{
void moveToHomePage();
}
public class UiServiceImpl implements UiService
{
public UiService(@ContexParam("username") String username, @ContexParam("username") String password)
{
login(username, password);
}
public void navigateToHomePage() {}
private void login(String username, String password)
{
//do login
}
}
public class GetUserDetailsTask implements Task
{
private ContextService context;
@Inject
public GetUserDetailsTask(ContextService context)
{
this.context = context;
}
public void execute()
{
Console c = System.console();
String username = c.readLine("Please enter your username: ");
String password = c.readLine("Please enter your password: ");
context.add("username", username);
context.add("password", password);
}
}
public class UseUiServiceTask implements Task
{
private UiService ui;
@Inject
public UseUiServiceTask(UiService uiService)
public void execute()
{
ui.moveToHomePage();
}
}
我希望能够使用Guice创建UseUiServiceTask的实例。 我如何实现这一目标?
答案 0 :(得分:3)
您的数据就是:数据。除非在获得模块之前定义数据,否则不要注入数据,并且应用程序的其余部分保持不变。
public static void main(String[] args) {
Console c = System.console();
String username = c.readLine("Please enter your username: ");
String password = c.readLine("Please enter your password: ");
Guice.createInjector(new LoginModule(username, password));
}
如果您希望在注射开始后检索数据,则不应尝试将其注入。那么你应该做的就是在所需的任何地方注入你的ContextService
和/或调用回调,但我更喜欢回调而不必集中维护数据。
public class LoginRequestor {
String username, password;
public void requestCredentials() {
Console c = System.console();
username = c.readLine("Please enter your username: ");
password = c.readLine("Please enter your password: ");
}
}
public class UiServiceImpl implements UiService {
@Inject LoginRequestor login;
boolean loggedIn;
public void navigateToHomePage() {
checkLoggedIn();
}
private void checkLoggedIn() {
if (loggedIn) {
return;
}
login.requestCredentials();
String username = login.getUsername();
String password = login.getPassword();
// Do login
loggedIn = ...;
}
}