Вот пример использования контроллера, введенного Guice.
/**
* Loads a FXML file and injects its controller from the given Guice {@code Provider}
*/
public abstract class GuiceFxmlLoader {
public GuiceFxmlLoader(Stage stage, Provider<?> provider) {
mStage = Objects.requireNonNull(stage);
mProvider = Objects.requireNonNull(provider);
}
/**
* @return the FXML file name
*/
public abstract String getFileName();
/**
* Load FXML, set its controller with given {@code Provider}, and add it to {@code Stage}.
*/
public void loadView() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(getFileName()));
loader.setControllerFactory(p -> mProvider.get());
Node view = loader.load();
setViewInStage(view);
}
catch (IOException ex) {
LOGGER.error("Failed to load FXML: " + getFileName(), ex);
}
}
private void setViewInStage(Node view) {
BorderPane pane = (BorderPane)mStage.getScene().getRoot();
pane.setCenter(view);
}
private static final Logger LOGGER = Logger.getLogger(GuiceFxmlLoader.class);
private final Stage mStage;
private final Provider<?> mProvider;
}
Вот конкретная реализация загрузчика:
public class ConcreteViewLoader extends GuiceFxmlLoader {
@Inject
public ConcreteViewLoader(Stage stage, Provider<MyController> provider) {
super(stage, provider);
}
@Override
public String getFileName() {
return "my_view.fxml";
}
}
Обратите внимание, что этот пример загружает представление в центр BoarderPane, который является корнем сцены в рабочей области. Это не относится к примеру (деталь реализации моего конкретного варианта использования), но решил оставить его, поскольку некоторые из них могут оказаться полезными.
Эта опция только влияет на фазу разработки. Это просто копирует ссылку на локальный каталог созданного блока.
, Если другой блок (T) хочет использовать метод от блока, Вы создаете (A), который имеет тип возврата или параметры от другого блока, на который ссылаются (R), он (T) должен быть в состоянии получить доступ к тому блоку (R). Это могло бы быть в состоянии сделать так, не делая ничего специального, если блок, на который ссылаются (R) установлен в GAC. Иначе этому нужна локальная копия этого.
Локальная копия важна для сценариев развертывания и инструментов. Как правило необходимо использовать CopyLocal=True, если ссылка не содержится в GAC.
Копия, Локальная по существу, означает, что я должен вручную развернуть этот DLL для своего рвения. Когда это - ложь, это по существу означает, что "Я завишу от другого компонента, который должен быть установлен отдельно или объединен в цепочку, DLL уже просто будет там".
Это действительно о целевой среде. Если локальная копия является ложью, Вы говорите, что блок будет уже существовать в целевой среде (обычно в GAC). Установка его к истинному гарантирует, что это появится в выводе Вашей сборки, поэтому помогает развернуться к целевой среде.
Ознакомьтесь со следующей ссылкой MSDN, в которой подробно объясняется поведение CopyLocal.
К сожалению, есть некоторые особенности, и CopyLocal не обязательно будет работать должным образом для ссылок на сборки во вторичных сборках, структурированных, как показано ниже.
Это затрудняет развертывание xcopy, если вы не планируете устанавливать стороннюю сборку в GAC на целевой машине.
Локальная копия была реализована действительно для поддержки локальной отладки. Когда вы сравниваете ваше приложение с пакетом и установкой, вы должны собрать ваши проекты в одну и ту же выходную папку и удостовериться, что у вас есть все необходимые там ссылки.
CopyLocal особенно болезненно при построении больших деревьев исходников. Был связанный с этим вопрос о том, как отключить CopyLocal здесь, на SO, вы можете посмотреть на странице Как переопределить настройки CopyLocal (Private) для ссылок в .NET из MSBUILD. А также Лучшие практики для больших решений в Visual Studio (2008).
О том, как работать со построением больших деревьев исходных текстов, я написал в статье MSBuild: Best Practices For Creating Reliable Builds, Part 2 .
Короче говоря, я бы сказал, отключить CopyLocal, когда копирование файла приводит к тому, что ваши сборки занимают больше времени, чем вы готовы потратить на каждую сборку.