Я написав цю відповідь близько чотирьох років тому, і моя думка не змінилася. Але відтоді на фронті мікропослуг відбулися значні зміни. Наприкінці я додав конкретні нотатки щодо мікропослуг ...
Я буду протистояти ідеї, маючи досвід у реальному світі, щоб підтримати свій голос.
Мене залучили до великої програми, яка мала п'ять контекстів для однієї бази даних. Зрештою, ми врешті-решт видалили всі контексти, крім одного - повернення до єдиного контексту.
Спочатку ідея декількох контекстів здається гарною ідеєю. Ми можемо розділити доступ до даних на домени та надати декілька простих легких контекстів. Звучить як DDD, правда? Це спростить наш доступ до даних. Ще один аргумент - це ефективність у тому, що ми отримуємо доступ лише до контексту, який нам потрібен.
Але на практиці, коли наша програма зростала, багато наших таблиць ділилися стосунками в різних контекстах. Наприклад, запити до таблиці A у контексті 1 також вимагають приєднання до таблиці B у контексті 2.
Це залишило нам пару поганих варіантів. Ми могли б дублювати таблиці в різних контекстах. Ми спробували це. Це створило декілька проблем із відображенням, включаючи обмеження EF, що вимагає, щоб кожна сутність мала унікальну назву. Таким чином, ми опинилися з особами, названими Person1 та Person2 в різних контекстах. Можна стверджувати, що з нашого боку це був поганий дизайн, але, незважаючи на наші зусилля, саме так наше застосування насправді виросло в реальному світі.
Ми також намагалися запитувати обидва контексти, щоб отримати необхідні нам дані. Наприклад, наша бізнес-логіка запитає половину того, що їй потрібно з контексту 1, а іншу половину з контексту 2. Це мало деякі основні проблеми. Замість того, щоб виконувати один запит в одному контексті, нам довелося виконувати кілька запитів у різних контекстах. Це реально реалізований штраф.
Зрештою, гарна новина полягає в тому, що було легко викреслити кілька контекстів. Контекст призначений для легкого об’єкта. Тому я не думаю, що ефективність є гарним аргументом для кількох контекстів. Майже у всіх випадках я вважаю, що єдиний контекст є простішим, менш складним і, швидше за все, матиме кращі результати, і вам не доведеться впроваджувати купу завдань, щоб змусити його працювати.
Я подумав про одну ситуацію, коли кілька контекстів можуть бути корисними. Окремий контекст може бути використаний для виправлення фізичної проблеми з базою даних, в якій вона фактично містить більше одного домену. В ідеалі, контекст був би один до одного домену, який був би один на один - до бази даних. Іншими словами, якщо набір таблиць жодним чином не пов'язаний з іншими таблицями в даній базі даних, їх, ймовірно, слід витягнути в окрему базу даних. Я усвідомлюю, що це не завжди практично. Але якщо набір таблиць настільки різний, що вам буде комфортно відокремлювати їх в окрему базу даних (але ви вирішите не робити), то я міг би бачити випадок використання окремого контексту, але тільки тому, що насправді є два окремих домену.
Що стосується мікропослуг, то один єдиний контекст все ще має сенс. Однак для мікропослуг кожна служба матиме свій власний контекст, який включає лише таблиці баз даних, що стосуються цієї послуги. Іншими словами, якщо служба x звертається до таблиць 1 і 2, а служба y отримує доступ до таблиць 3 і 4, кожна служба матиме свій унікальний контекст, який включає таблиці, характерні для цієї послуги.
Мене цікавлять ваші думки.