Объявление презентаторов и представлений

Я создаю приложение WPF, состоящее из экранов (Presenter + View). Я хочу иметь возможность объявлять эти экраны в файле конфигурации или базе данных SQL. Я пытался придумать хорошее решение, от которого отказался, и спрашиваю, как некоторые из вас создают такие вещи? Я работаю над этим больше недели, и каждое решение, которое я придумываю, воняет.

В моем приложении WPF у меня есть древовидное представление, представляющее экраны. Когда пользователь нажимает на узел, загружается экран. Я хочу иметь возможность заполнять тройные узлы из файла конфигурации или базы данных. Программа не должна заботиться о том, где они хранятся, поэтому я могу заменить хранилище конфигурации хранилищем базы данных. Если у меня хранится информация об экране, я также могу использовать контейнер IOC для создания экземпляров экранов для меня и получения их по имени. Вот пример схемы файла конфигурации, которую я придумал:

<screen name = "" title = "" presenterType = "" viewType = ""/>
<screen ...>
    <screen .../>
    <screen .../>
</screen>
<screen .../>

Последнее решение, которое я придумал, - использовать ScreenService, который запрашивает у ScreenRepository объекты ScreenInfo. Тогда я смогу заполнить древовидное представление и контейнер IOC этой информацией.

Звучит как хорошее решение? Что бы вы сделали по-другому? И как вы проектируете такую ​​систему в собственном программировании?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
110
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В общем, для таких ситуаций вам нужно использовать Factory Pattern. Ваше сочетание ScreenService, ScreenRepository и Screeninfo звучит так, как будто вы его прибили. Здесь - это базовый обзор того, что такое Factory Pattern. Вы можете использовать статью в Википедии в качестве отправной точки, чтобы увидеть, есть ли какие-либо варианты или аспекты, которые вы пропустили.

Я разработал и поддерживаю приложение CAD / CAM, в котором есть несколько библиотек предварительно заданных параметрических форм, где пользователь может ввести несколько размеров и рассчитать форму для резки. У каждой формы своя настройка экрана. Я использую шаблон, аналогичный вашему, при запуске своих приложений.

Я просматриваю каталог библиотеки форм для каждой сборки, выбираю фабричный класс, у которого есть метод, извлекающий список фигур, загружаю его в главный список. Когда пользователь нажимает кнопку панели инструментов или выбирает из списка, программное обеспечение затем использует клавишу, чтобы вытащить нужную фигуру из списка, который предоставляет интерфейс IShapeScreen. Форма, которая управляет фигурами, использует этот интерфейс для рисования правильного экрана ввода для этой фигуры.

Этот метод работал почти десять лет без каких-либо серьезных проблем и, что столь же важно, не оставил меня с чувством «О, если бы я сделал это, когда я его разработал». Так что я думаю, что вы на правильном пути.

Обратите внимание, что вам может не понадобиться использовать текстовый файл конфигурации. Используя атрибуты, некоторые определяемые вами интерфейсы и API отражения .NET, вы можете просто поместить библиотеки DLL в каталог, который программа может сканировать и правильно извлекать из нужных объектов. В вашем случае экранные объекты. Однако, если вы хотите, чтобы человек редактировал конфигурацию, то вам, безусловно, потребуется текстовый файл. Я предполагаю, что вы используете .NET API, как вы отметили .NET.

Извините, я должен был упомянуть, что использую .NET 3.5. Я так привык размещать сообщения на форуме ASP.NET, что забыл.

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

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

Спасибо за ответ. Мне нравится видеть, как поступают другие. Это помогает мне понять многие из этих концепций дизайна, поскольку я только начинаю путь к шаблонам дизайна (только что заказал книгу PEAA). Кто-нибудь еще, пожалуйста, поделитесь своими мыслями. Это также может помочь кому-то вроде меня, кто наткнется на этот вопрос.

Ответ принят как подходящий

Когда вы возвращаете объекты из своего фабричного метода, вы также можете включать иерархию. Например, у моих фабрик форм есть два метода: один возвращает список фигур, добавленных в главный список, другой возвращает библиотеки форм. Хотя пользователь может определять и изменять фактические библиотеки, у меня есть набор по умолчанию, автоматически сгенерированный для использования для устранения неполадок и начальной установки. Это иерархично.

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

ЕСЛИ на вашем экране есть информация об иерархии, встроенная в одно из многих свойств, я рекомендую вам выделить ее в элемент иерархии. Затем можно создать HierarchyList, который состоит из HierarchyLists ИЛИ HierarchyItem. Я бы сделал интерфейс IHierarchyItem так, чтобы HierarchyLists выглядело как элемент.

Основное отличие - поведение. Когда вы щелкаете HeirarchyList, откроется другой список (или расширится и т. д.), Настоящий элемент отобразит экран.

Таким образом, ваша сборка будет иметь два класса, отмеченных одним из двух атрибутов. Один будет ScreenFactory, а другой - HierarchyFactory.

Обратите внимание, что вам не нужно использовать ключи, вы можете напрямую связать HierarchyItem с формой. Я использую ключи GUID, чтобы не связывать каждый раз. Сцепление не всегда плохо, но и не всегда хорошо. Поскольку GUID фактически уникальны, он работает одинаково.

Что касается производительности, вам придется провести сотни НКУ, прежде чем вы это заметите. Помните, что вам не обязательно иметь сборку для каждого экрана. Просто сгруппируйте их логически в несколько сборок, и все готово.

Другие вопросы по теме