Библиотека классов C # - Где недостаток дизайна и как его решить - PullRequest
0 голосов
/ 24 января 2012

В типичном организационном приложении, которое я создаю, сущности User, Projects, Company, Contacts существуют.Для пользовательского класса, определенного ниже, я думаю, что у меня будет круговая зависимость. Как мне изменить класс ниже, чтобы решить проблему.

Пользователь

  • Имя пользователя

  • Компания

  • Проекты List<Projects>

Проект

  • ProjectName

  • Ресурсы List<Resource>

  • Руководитель проекта User

Ресурс

  • ResourceId

  • ProjectId

  • ReportingHead User

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

Несмотря на то, что ресурс связан с проектом, мне нужно будет добавить свойство projectId (сначала это был тип проекта), потому что у меня было IResourceRepository для создания ресурса для проекта, который возвращал бы экземпляр Resource.Как должен быть разработан класс, чтобы он имел смысл?

1 Ответ

1 голос
/ 24 января 2012

Вы можете потратить некоторое время на чтение агрегатов и корней агрегатов.

Что такое совокупный корень?

Определите одну из ваших сущностей как корень и попробуйте и посмотрите, подходит ли она вашим сценариям.Я приведу вам пример.Это очень сложно, не зная ваших сценариев, хотя, поэтому посмотрим на это в качестве примера:

Я использую сводный корень Companyas.

Company
  Name:string
  Projects:IList<Project>

Project
  ProjectName:string
  Resources:IList<Resource>
  Projecthead:Employee

Resource
  Employee:Employee
  (ResourceType probably)

Employee
  Name

(идентификаторы опущены, но, вероятно, будут в некотором базовом классеесли вы хотите, чтобы БД сохранялась)

Теперь вы должны убедиться, что у вас есть доступ к этому Агрегированному корню только через корневую Компанию.Речь идет об изоляции, и кажется довольно странным, что вы больше не можете делать такой метод, как user.GetAllMyProjects (), но это облегчит вам задачу позже.Вместо этого вы можете создать метод наподобие project.HasGivenUserAccess (пользовательский пользователь).Это, вероятно, достаточно, но это зависит от ваших сценариев.

Не стесняйтесь атаковать этот дизайн по какому-то сценарию, который, как вы думаете, он не обрабатывает, и я отредактирую свой пост.

...