Google Guice module that loads two kinds of views
up vote
2
down vote
favorite
The code of my Guice Module looks like this:
public class FXMLModule extends AbstractModule {
private final Locale locale = Locale.getDefault();
private final ResourceBundle messages = ResourceBundle.getBundle("i18n.messages", locale);
@Override
protected void configure() {
bind(Controller.class).annotatedWith(MainView.class).to(MainController.class);
bind(Controller.class).annotatedWith(MovieView.class).to(MovieViewController.class);
}
@Provides @MainView
public FXMLLoader mainViewLoader(@MainView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MainView.fxml"), messages);
loader.setController(controller);
return loader;
}
@Provides @MovieView
public FXMLLoader movieViewLoader(@MovieView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MovieView.fxml"), messages);
loader.setController(controller);
return loader;
}
private URL locate(String location) {
return getClass().getResource(location);
}
}
Basically I want to inject fully configured FXMLLoader
s into some Controller classes, so that they can work with the root nodes returned from the loaders without having to know anything about other controllers. The MainViewLoader
gets injected into the Application
class, and the MovieViewLoader
gets injected into MainViewController
. It works, but I'd have to write a provide method (with almost the same code) for every loader/controller. Any ideas how to make this more generic?
java dependency-injection javafx dynamic-loading guice
bumped to the homepage by Community♦ 38 mins ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
up vote
2
down vote
favorite
The code of my Guice Module looks like this:
public class FXMLModule extends AbstractModule {
private final Locale locale = Locale.getDefault();
private final ResourceBundle messages = ResourceBundle.getBundle("i18n.messages", locale);
@Override
protected void configure() {
bind(Controller.class).annotatedWith(MainView.class).to(MainController.class);
bind(Controller.class).annotatedWith(MovieView.class).to(MovieViewController.class);
}
@Provides @MainView
public FXMLLoader mainViewLoader(@MainView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MainView.fxml"), messages);
loader.setController(controller);
return loader;
}
@Provides @MovieView
public FXMLLoader movieViewLoader(@MovieView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MovieView.fxml"), messages);
loader.setController(controller);
return loader;
}
private URL locate(String location) {
return getClass().getResource(location);
}
}
Basically I want to inject fully configured FXMLLoader
s into some Controller classes, so that they can work with the root nodes returned from the loaders without having to know anything about other controllers. The MainViewLoader
gets injected into the Application
class, and the MovieViewLoader
gets injected into MainViewController
. It works, but I'd have to write a provide method (with almost the same code) for every loader/controller. Any ideas how to make this more generic?
java dependency-injection javafx dynamic-loading guice
bumped to the homepage by Community♦ 38 mins ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
The code of my Guice Module looks like this:
public class FXMLModule extends AbstractModule {
private final Locale locale = Locale.getDefault();
private final ResourceBundle messages = ResourceBundle.getBundle("i18n.messages", locale);
@Override
protected void configure() {
bind(Controller.class).annotatedWith(MainView.class).to(MainController.class);
bind(Controller.class).annotatedWith(MovieView.class).to(MovieViewController.class);
}
@Provides @MainView
public FXMLLoader mainViewLoader(@MainView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MainView.fxml"), messages);
loader.setController(controller);
return loader;
}
@Provides @MovieView
public FXMLLoader movieViewLoader(@MovieView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MovieView.fxml"), messages);
loader.setController(controller);
return loader;
}
private URL locate(String location) {
return getClass().getResource(location);
}
}
Basically I want to inject fully configured FXMLLoader
s into some Controller classes, so that they can work with the root nodes returned from the loaders without having to know anything about other controllers. The MainViewLoader
gets injected into the Application
class, and the MovieViewLoader
gets injected into MainViewController
. It works, but I'd have to write a provide method (with almost the same code) for every loader/controller. Any ideas how to make this more generic?
java dependency-injection javafx dynamic-loading guice
The code of my Guice Module looks like this:
public class FXMLModule extends AbstractModule {
private final Locale locale = Locale.getDefault();
private final ResourceBundle messages = ResourceBundle.getBundle("i18n.messages", locale);
@Override
protected void configure() {
bind(Controller.class).annotatedWith(MainView.class).to(MainController.class);
bind(Controller.class).annotatedWith(MovieView.class).to(MovieViewController.class);
}
@Provides @MainView
public FXMLLoader mainViewLoader(@MainView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MainView.fxml"), messages);
loader.setController(controller);
return loader;
}
@Provides @MovieView
public FXMLLoader movieViewLoader(@MovieView Controller controller) {
FXMLLoader loader = new FXMLLoader(locate("/jfx/fxml/MovieView.fxml"), messages);
loader.setController(controller);
return loader;
}
private URL locate(String location) {
return getClass().getResource(location);
}
}
Basically I want to inject fully configured FXMLLoader
s into some Controller classes, so that they can work with the root nodes returned from the loaders without having to know anything about other controllers. The MainViewLoader
gets injected into the Application
class, and the MovieViewLoader
gets injected into MainViewController
. It works, but I'd have to write a provide method (with almost the same code) for every loader/controller. Any ideas how to make this more generic?
java dependency-injection javafx dynamic-loading guice
java dependency-injection javafx dynamic-loading guice
edited Sep 16 '17 at 17:32
200_success
127k15149412
127k15149412
asked Aug 14 '17 at 1:06
guicy
111
111
bumped to the homepage by Community♦ 38 mins ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
bumped to the homepage by Community♦ 38 mins ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
What this is looking for is "Binding by Convention". Since Guice is intended to be as lightweight (and fast) as possible, it does not contain facilities to enable binding by convention.
Neither does Spring for that matter. I think you might be able to automate the bindings injected into the methods if you use Plexus.
Do note that none of this will alleviate you from the actual problem you're facing:
Why?
You write:
Basically I want to inject fully configured FXMLLoaders into some
Controller classes, so that they can work with the root nodes returned
from the loaders without having to know anything about other
controllers.
This makes no sense: You're injecting FXMLLoader
s into Controller
s, specifically into a controller that's not the Controller
you set on the FXMLLoader
itself. To access the rootNode returned by the loader.
This violates the Law of Demeter. You're grabbing into the responsibilities of another controller.
The solution to this problem is to expose a method on the controller and inject a the controller instance you need, instead of the loader.
This whole module seems to me like it's solving the wrong problem in the first place ...
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
What this is looking for is "Binding by Convention". Since Guice is intended to be as lightweight (and fast) as possible, it does not contain facilities to enable binding by convention.
Neither does Spring for that matter. I think you might be able to automate the bindings injected into the methods if you use Plexus.
Do note that none of this will alleviate you from the actual problem you're facing:
Why?
You write:
Basically I want to inject fully configured FXMLLoaders into some
Controller classes, so that they can work with the root nodes returned
from the loaders without having to know anything about other
controllers.
This makes no sense: You're injecting FXMLLoader
s into Controller
s, specifically into a controller that's not the Controller
you set on the FXMLLoader
itself. To access the rootNode returned by the loader.
This violates the Law of Demeter. You're grabbing into the responsibilities of another controller.
The solution to this problem is to expose a method on the controller and inject a the controller instance you need, instead of the loader.
This whole module seems to me like it's solving the wrong problem in the first place ...
add a comment |
up vote
0
down vote
What this is looking for is "Binding by Convention". Since Guice is intended to be as lightweight (and fast) as possible, it does not contain facilities to enable binding by convention.
Neither does Spring for that matter. I think you might be able to automate the bindings injected into the methods if you use Plexus.
Do note that none of this will alleviate you from the actual problem you're facing:
Why?
You write:
Basically I want to inject fully configured FXMLLoaders into some
Controller classes, so that they can work with the root nodes returned
from the loaders without having to know anything about other
controllers.
This makes no sense: You're injecting FXMLLoader
s into Controller
s, specifically into a controller that's not the Controller
you set on the FXMLLoader
itself. To access the rootNode returned by the loader.
This violates the Law of Demeter. You're grabbing into the responsibilities of another controller.
The solution to this problem is to expose a method on the controller and inject a the controller instance you need, instead of the loader.
This whole module seems to me like it's solving the wrong problem in the first place ...
add a comment |
up vote
0
down vote
up vote
0
down vote
What this is looking for is "Binding by Convention". Since Guice is intended to be as lightweight (and fast) as possible, it does not contain facilities to enable binding by convention.
Neither does Spring for that matter. I think you might be able to automate the bindings injected into the methods if you use Plexus.
Do note that none of this will alleviate you from the actual problem you're facing:
Why?
You write:
Basically I want to inject fully configured FXMLLoaders into some
Controller classes, so that they can work with the root nodes returned
from the loaders without having to know anything about other
controllers.
This makes no sense: You're injecting FXMLLoader
s into Controller
s, specifically into a controller that's not the Controller
you set on the FXMLLoader
itself. To access the rootNode returned by the loader.
This violates the Law of Demeter. You're grabbing into the responsibilities of another controller.
The solution to this problem is to expose a method on the controller and inject a the controller instance you need, instead of the loader.
This whole module seems to me like it's solving the wrong problem in the first place ...
What this is looking for is "Binding by Convention". Since Guice is intended to be as lightweight (and fast) as possible, it does not contain facilities to enable binding by convention.
Neither does Spring for that matter. I think you might be able to automate the bindings injected into the methods if you use Plexus.
Do note that none of this will alleviate you from the actual problem you're facing:
Why?
You write:
Basically I want to inject fully configured FXMLLoaders into some
Controller classes, so that they can work with the root nodes returned
from the loaders without having to know anything about other
controllers.
This makes no sense: You're injecting FXMLLoader
s into Controller
s, specifically into a controller that's not the Controller
you set on the FXMLLoader
itself. To access the rootNode returned by the loader.
This violates the Law of Demeter. You're grabbing into the responsibilities of another controller.
The solution to this problem is to expose a method on the controller and inject a the controller instance you need, instead of the loader.
This whole module seems to me like it's solving the wrong problem in the first place ...
answered Aug 17 '17 at 10:54
Vogel612♦
21.3k346128
21.3k346128
add a comment |
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f172920%2fgoogle-guice-module-that-loads-two-kinds-of-views%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown