2013-09-12 2 views
1

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

Скажите, что у меня есть доменное имя «Пользователь», «Учреждение».

Этот «Пользователь» может быть зарегистрирован на различные «услуги», например «учет или библиотека». Я создал абстрактный класс «ServiceRegistration», а «Пользователь» имеет список этих регистраций услуг. Эти сервисы - это не что иное, как модули, которые в будущем будут включены в качестве компонента. Поэтому, когда мой компонент библиотеки завершен, я могу подключиться к моей системе. Компонент библиотеки будет иметь класс «LibraryServiceRegistration», который будет храниться в списке «Пользователь» -> «Служба регистрации». «Пользователь» не знает об этом «LibraryServiceRegistration» и, таким образом, становится расширяемым. Компонент библиотеки в настоящее время знает «Пользователь», чтобы он мог хранить информацию «LibraryServiceRegistration» в «Пользователь».

Но теперь скажу, что я создал новые компоненты «Учет», которые применимы к «Пользователь» и «Учреждение». Мой учетный компонент будет иметь «AccountingServiceRegistration», хранящийся в «User» -> «ServiceRegistration» для каждого пользователя и «Institution» -> «ServiceRegistration» для каждого учреждения.

Я хочу изолировать компонент «Бухгалтерский учет», чтобы я мог настроить его на какой домен, который он может предоставить. Таким образом, в настоящее время он может предоставлять услуги «Пользователь» и «Учреждение» в будущем без изменения кода.

Возможно ли это?

ответ

0

Таким образом, определенная часть кода в вашей системе должна знать об услугах и сущностях. Вопрос в том, какой фрагмент кода должен позаботиться об этом.

Вот варианты, которые я вижу:

  • организация определяет, какие услуги она может принимать (нежелательно по вашему сообщению)
  • службы определяет, какие объекты он поддерживает (возможно) класс регистрации
  • сервиса определяет, какие объекты он поддерживает (это также может быть полезно)
  • новый класс (завод?) обрабатывает совпадение (может работать, если вы уже используете завод)

Все это становится намного проще, если все ваши объекты домена реализуют общий интерфейс.

Моя рекомендация заключалась бы в том, чтобы иметь абстрактный метод в базовой службе, в которой перечислены сущности, которые он поддерживает. Затем каждая служба объявляет, какие объекты она поддерживает. Кроме того, какой бы метод на службе не создавал новую регистрацию в отношении объекта, он мог бы проверить тип сущности.

Надеюсь, это поможет

Смежные вопросы