Я прочитал StackOverflow guidelines и искал design-specific SE site. Если вы чувствуете, что этот вопрос еще слишком длинный или неясный, сообщите мне, и я попробую еще раз.Как мой слой DAO взаимодействует с уровнем представления?
Я поддерживать N-уровневой линии бизнеса, WinForms приложение с помощью следующего слоя/конструкция:
- [WinForm Применение]
- [MVP на основе представления Layer (САВ, специфически)]
- [Service Layer]
- [Access Layer Data]
Приложение интегрируется с различный ERP/бизнес-система, которая обрабатывается в DAO слое с использованием ERP/бизнес-система конкретных реализаций DAO интерфейсов, например:
public sealed class QBTransactionAssemblyBuildDAO : QBDAO, ITransactionAssemblyBuildDAO
public sealed class SAPTransactionAssemblyBuildDAO : SAPDABase, ITransactionAssemblyBuildDAO
Например, один бизнес-подразделение может использовать приложение интегрируется с QuickBooks. Это будет настроено в app.config, и фабричный метод создаст соответствующие реализации QB * DAO во время выполнения. Аналогично, другое подразделение может использовать его интегрированным с SAP, файл конфигурации будет поддерживать это, и на заводе будут реализованы реализации SAP * DAO. Затем сервисы могут использовать DAO, оставаясь неосведомленными о встроенной интегрированной системе.
Все это отлично работало, и на самом деле дизайн выплатил дивиденды, поскольку мне пришлось добавить дополнительные интегрированные системы и поддержку записи. Сегодня все изменилось, когда я столкнулся с ситуацией, когда API интегрированного приложения не поддерживал задачу, которую могут поддерживать все другие системы. Я сейчас в ситуации, когда мне нужно поддерживать исключительный поток и вместо того, чтобы обновлять данные, скажем, SAP. Мне нужно предоставить пользователю диалог с данными, которые они могут вручную записать (ОК, скопировать и вставить) в Пользовательский интерфейс приложения SAP.
Если я придерживаюсь принципов разделения слоев и разделов, первая возможность для моего направления потока приложений находится на уровне обслуживания, так как этот уровень хорошо осведомлен о том, какие ERP/бизнес-приложения интегрированы. На уровне сервиса я могу получить запрос «RecognizeDelayedRevenue», получить ссылку на мой конкретный объект DAO и спросить его, поддерживает ли он операцию (последняя часть является новой). Если он возвращает отрицательный, у меня теперь есть проблема проектирования с представлением диалога пользователю, включая предварительную обработку данных, которые он представляет, используя методы, которые принадлежат объектам DAO.
Мой вопрос: С точки зрения дизайна, который является большим грехом:
- слой Service пытается создать и показать win32 диалоги, в основном преодолев отдельный бизнес-логики и представления
- объект DAO принимает (т. е. претендует на поддержку) запроса и вместо того, чтобы выполнять его интегрированную систему, он каким-то образом представляет диалог пользователю
- Принесите интегрированные знания системы на уровень презентатора и обработайте там исключение.
Конечно, если у вас есть идея, о которой я не упомянул, это было бы очень интересно! :)
Я фанат Фаулера, но интерфейс Роли не привлек мое внимание раньше; спасибо за ссылку. Я борюсь с тем, как применить ваше предложение к моим 3 участвующим слоям: объект, который (или не будет) реализовывать интерфейс ролей, будет моим объектом DAO, который неизвестен уровню представления. Как бы вы включили уровень обслуживания в это решение? Моя служба предназначена для решения задачи, которая является предметом этого вопроса, но только после того, как ИТ попытается использовать уровень DAO, который он может проверить для интерфейса ролей. Надеюсь, это имело смысл. –
Ах. Да. Я пропустил эту деталь. Это усложняет задачу, поскольку служба может поддерживать возможность запроса интерфейса, когда она используется как родная часть стека, но если она станет или является удаленным интерфейсом, вам нужно будет обратиться к службе, если он поддерживает эту функциональность, получая ответ как часть ответа. Возможно, вы сможете сделать это один раз и удержать ответ, а не постоянно запрашивать? –