Cómo inyectar una dependencia “tiempo de ejecución” como un usuario conectado que no está disponible en el arranque de aplicaciones?

StackOverflow https://stackoverflow.com/questions/4629777

Pregunta

Yo no estoy haciendo esto:

Yo uso en mi Gin java GWT aplicación para hacer DI. La pantalla de inicio de sesión está integrada en la ventana de la aplicación completa. Después de que el usuario ha iniciado sesión en la que quiero para inyectar el objeto de usuario en otras clases como presentadores interfaz gráfica de usuario que creo, así que tengo algún tipo de dependencia de tiempo de ejecución que creo. ¿Cómo puedo hacer eso?

Una solución que se me ocurre es algo como:

class Presenter {
  @Inject
  Presenter(LoggedInUserFactory userFactory) {
     User user = userFactory.getLoggedInUser();
  }
}

class LoggedInUserFactoryImpl {
  public static User user;
  User getLoggedInUser() {
    return user;
  }
}

Así, cuando el usuario se registra con éxito en y tengo el objeto i establecer la propiedad estática en LoggedInUserFactory, pero esto sólo funcionará si se crea el Presenter después de que el usuario ha iniciado sesión en la que no es el caso.

O debería utilizar un registro estática global? Simplemente no me gusta la idea de tener dependencias estáticas en mis clases.

Cualquier entrada está muy apreciada.

¿Fue útil?

Solución

En lugar de flexión DI hacia atrás para suministrar el usuario, el uso de un EventBus para disparar un evento cuando el usuario inicia sesión en.

Si es absolutamente necesario utilizar DI para esto y los presentadores que requieren que el usuario no se usan hasta inicializado correctamente con un usuario que no sea nulo puede aplazar su llamada a GWT.create(MyGinjector.class) hasta después de que el usuario está conectado. Usted tendría entonces dos llamadas de ese tipo en su aplicación: uno para la ruta de código de usuario y una segunda para el resto de la aplicación

.

Otros consejos

Se podría utilizar el proveedor interfaz.

class Presenter {
  @Inject
  Presenter(Provider<User> userProvider) {
     User user = userProvider.get();
  }
}

class UserProvider implements Provider<User> {
  public User user;
  User get() {
    return user;
  }
}

A continuación, el módulo tendría un proveedor de href="http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProviderBindings" unión como esto:

bind(User.class).toProvider(UserProvider.class);

EDIT: Para establecer la variable de usuario, código de cliente podría obtener la instancia de la clase UserProvider a través de una unión como esta:

bind(UserProvider.class).in(Singleton.class);

... lo que permitiría que el código de cliente para hacer esto:

injector.getInstance(UserProvider.class).user = new User(...)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top