Применение Unity в динамическом меню - PullRequest
0 голосов
/ 25 апреля 2010

Я просматривал Unity 2.0, чтобы проверить, эффективно ли он используется в нашем новом приложении. Мое приложение в настоящее время является приложением Windows Forms и использует традиционное меню панели (вверху).

Мои пользовательские интерфейсы (Windows Forms) более или менее поддерживают шаблон внедрения зависимостей, поскольку все они работают с классом (класс модели представления), предоставленным им через конструктор. Затем форма связывается со свойствами предоставленного класса P Model и вызывает методы класса P Model для выполнения своих обязанностей. Довольно просто и понятно.

То, как P-модель реагирует на действия пользовательского интерфейса и реагирует на них путем координации с классом предметной области (бизнес-логика / модель), здесь не имеет значения и, следовательно, не упоминается.

Последовательность создания объекта для отображения одного пользовательского интерфейса из меню выглядит следующим образом -

  1. Создание экземпляра бизнес-модели
  2. Создание экземпляра модели презентации с передачей экземпляра бизнес-модели конструктору P-модели.
  3. Создание экземпляра пользовательского интерфейса с экземпляром модели представления, переданным в конструктор пользовательского интерфейса.

Мое настоящее решение:

Чтобы показать пользовательский интерфейс описанным выше способом из моего меню, мне нужно будет сослаться на все сборки (Business, PModel, UI) из моего класса Menu. Учитывая, что я разделил модули на несколько физических сборок, было бы сложно добавить ссылки на около 60 различных сборок. Кроме того, этот подход не очень масштабируемый, так как мне, безусловно, нужно выпускать больше модулей, и при таком подходе мне придется менять исходный код каждый раз, когда я выпускаю новый модуль.

Поэтому, прежде всего, чтобы избежать ссылки на такое количество сборок из моего класса Menu (сборка), я сделал, как показано ниже -

Все описанные выше зависимости хранятся в таблице базы данных (SQL Server), например

ModuleShortCode | BModelAssembly | BModelFullTypeName | PModelAssembly | PModelFullTypeName | UIAssembly | UIFullTypeName

Теперь используется статический класс с именем «Launcher» с методом «Launch», как показано ниже -

Launcher.Launch("Discount");
Launcher.Launch("Customers");

Модуль запуска внутренне использует данные из таблицы зависимостей и использует Activator.CreateInstance () для создания каждого из объектов и использует экземпляр в качестве параметра конструктора для следующего создаваемого объекта, пока не будет построен пользовательский интерфейс. Пользовательский интерфейс затем отображается в виде модального диалога. Код в Launcher похож на

Form frm = ResolveForm("Discount");
frm.ShowDialog();`

ResolveForm выполняет построение цепочки объектов.

Может ли Unity помочь мне здесь?

Теперь, когда я это сделал, у меня не было достаточно информации о Unity, и теперь, когда я изучал Unity, я думаю, что делал более или менее то же самое. Поэтому я попытался заменить свой код на Unity.

Однако, как только я начал, я ударил блок. Если я попытаюсь разрешить формы пользовательского интерфейса в моем меню как

Form customers = myUnityContainer.Resolve<Customers>();

или

Form customers = myUnityContainer.Resolve(typeof(Customers));

Тогда в любом случае мне нужно ссылаться на мою сборку пользовательского интерфейса из моей сборки меню, поскольку для ее разрешения должен быть известен целевой тип «Клиенты». Так что я вернулся в то же место, так как мне пришлось бы ссылаться на все сборки пользовательского интерфейса из сборки меню. Я понимаю, что с Unity мне пришлось бы ссылаться на меньшее количество сборок (только сборки пользовательского интерфейса), но эти ссылки необходимы, что противоречит моим целям ниже -

  1. Создание цепочки объектов динамически без какой-либо ссылки на сборку из меню сборки. Это сделано для того, чтобы исходный код меню не менялся каждый раз, когда я выпускаю новый модуль. Мое меню также строится динамически из таблицы.

  2. Возможность поставлять новые модули, просто предоставляя новые сборки и вставляя новую строку зависимостей в таблицу с помощью патча базы данных.

На этом этапе у меня возникает ощущение, что я должен сделать это так, как делал я, то есть Activator.CreateInstance (), чтобы выполнить все мои задачи. Мне нужно проверить, думает ли сообщество так же, как я, или есть лучшее предложение для решения проблемы.

Пост действительно длинный, и я искренне благодарю вас, если вы дойдете до этого момента. Жду ваших ценных предложений.

  • Раджарши

1 Ответ

0 голосов
/ 27 апреля 2010

Как видно из этого кода

Form customers = myUnityContainer.Resolve<Customers>();

весь ваш код должен знать о клиенте - это класс Form. Поэтому, если вы используете конфигурацию xml для единства, вы можете сделать следующее:

 <type type="Form" mapTo="Customer"  name="Customer">
 </type>

И тогда вы сможете решить это так:

Form customers = myUnityContainer.Resolve<Form>("Customer");

и нет необходимости ссылаться на вашу сборку пользовательского интерфейса. Конечно, это должно быть представлено в каталоге bin или GAC. В этом случае, если вы будете разрабатывать новую сборку - все, что вам нужно, это изменить конфигурацию и вставить в bin или gac.

Если вы хотите настроить единицу из db, вам нужно добавить ссылку на ваш пользовательский интерфейс, потому что вам придется вызывать Register («Клиент»).

...