Передумови:
я розробляю серверну програму і створюю окремі DLL для різних підсистем. Для спрощення речей, скажімо, у мене є дві підсистеми: 1) Users2)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());
частина Я не впевнений у цьому: так, користувачі виявляють агностик проектів, але насправді інформація про членство в проекті зберігається в системі користувачів, а не в проектах. Я просто не відчуваю себе природним, тому я намагаюся визначити, чи є тут великий недолік, який мені не вистачає.