Прежде чем все будут бросать в меня камни, я искал в Google / MSDN / StackOver поток связанных вопросов и ответов, но ни один из них не соответствовал моим потребностям.
Я работаю над довольно большим приложением на С# - Windows Forms, которое в настоящее время делится на следующее:
- Уровень данных
- Домен-уровень
- UI-слой
В основном в моей текущей ситуации роли этих слоев следующие:
- Уровень данных отвечает за связь с хранилищем данных, в основном операции CRUD.
- Ответственность доменного уровня заключается в том, чтобы хранить модель наших объектов, создавать объекты, применять бизнес-правила и т. д.
- UI-Layer — это то, что пользователь видит и с чем взаимодействует.
Моя проблема заключается в следующем:
Из слоя пользовательского интерфейса пользователь имеет доступ к таким полям, как: имя, имя проекта, номер проекта, которые в основном являются текстовыми полями, календарями и т. д. — все они являются компонентами пользовательского интерфейса.
После ввода пользователя я вызываю метод с именем: AddExplorerNode(string name, string projectName, int projectNumber)
, который находится на уровне домена. Этот метод отвечает на основе переданных параметров за создание ExplorerNode Object ("особый" TreeNode), который требует, чтобы переданные параметры действительно были действительными.
После того, как объект был создан, очищен, проверен и т. д., тот же метод, упомянутый выше, передает созданный объект на уровень данных, который помещает его в кэш-репозиторий, а затем сохраняет его в хранилище данных, если все прошло нормально в Кэш.
Так что до сих пор в основном все разделено UI -> Domain -> DataLayer.
Мой вопрос: могу ли я заменить подпись метода домена из
AddExplorerNode(string name, string projectName, int projectNumber)
в AddExplorerNode(TreeNode node)
и на основе объекта TreeNode и его свойств построить фактический объект, который мне нужен? Я спрашиваю об этом, потому что, если доменные уровни знают о пользовательском интерфейсе (в данном случае о компоненте пользовательского интерфейса TreeNode), в основном мы нарушаем разделение.
Например, если в следующем году мы заменим WindowsForms на Консольное приложение, то проект будет нарушен из-за того, что Консольное приложение не будет иметь компонент пользовательского интерфейса TreeNode.
В этом случае лучше ли иметь доменный метод, который принимает, например, 5-10 параметров (целые, строки и т. д.) и на основе этих параметров создает мой объект или заменяет параметры компонентом пользовательского интерфейса TreeNode, который?
Заранее спасибо.
@РЕДАКТИРОВАТЬ:
Я задаю этот вопрос, потому что мой коллега просмотрел мой код и начал его рефакторить. Путем рефакторинга он выставлял фактический компонент пользовательского интерфейса TreeNode на уровень домена. Мой подход был AddExplorerNode (строковое имя, строковое имя проекта, int projectNumber) и т. д.