Передумови:
я розробляю серверну програму і створюю окремі DLL для різних підсистем. Для спрощення речей, скажімо, у мене є дві підсистеми: 1) Users
2)Projects
Загальнодоступний інтерфейс користувачів має такий спосіб, як:
IEnumerable<User> GetUser(int id);
Загальнодоступний інтерфейс Проектів має такий метод, як:
IEnumerable<User> GetProjectUsers(int projectId);
Так, наприклад, коли нам потрібно відобразити користувачів для певного проекту, ми можемо зателефонувати, GetProjectUsers
і це поверне об'єкти з достатньою інформацією для показу в сітці даних або подібному.
Проблема: в
ідеалі Projects
підсистема також не повинна зберігати інформацію про користувачів, а вона повинна просто зберігати ідентифікатори користувачів, які беруть участь у проекті. Для того , щоб служити GetProjectUsers
, він повинен зателефонувати GetUser
в Users
системі для кожного ідентифікатора користувача , що зберігається у власній базі даних. Однак для цього потрібно багато окремих GetUser
викликів, викликаючи безліч окремих запитів sql всередині User
підсистеми. Я ще не дуже перевіряв це, але наявність цього балаканого дизайну вплине на масштабованість системи.
Якби я відклав поділ підсистем, я міг би зберігати всі дані в одній схемі , доступні обидва систем і Projects
можу просто зробити , JOIN
щоб отримати всі користувач проекту в одному запиті. Projects
також потрібно знати, як генерувати User
об'єкти з результатів запиту. Але це порушує розлуку, що має багато переваг.
Питання:
Чи може хтось запропонувати спосіб зберегти розлуку, уникаючи всіх цих індивідуальних GetUser
дзвінків під час GetProjectUsers
?
Наприклад, я маю на увазі, що користувачі могли надати зовнішнім системам можливість "тегувати" користувачів за допомогою пари міток-значень та запитувати користувачів з певним значенням, наприклад:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Тоді система Проекти може тегувати кожного користувача під час їх додавання до проекту:
AddUserTag(userId,"project id", myProjectId.ToString());
і під час GetProjectUsers, він може запитувати всіх користувачів проекту за один дзвінок:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
частина Я не впевнений у цьому: так, користувачі виявляють агностик проектів, але насправді інформація про членство в проекті зберігається в системі користувачів, а не в проектах. Я просто не відчуваю себе природним, тому я намагаюся визначити, чи є тут великий недолік, який мені не вистачає.