Я реализовал нечто подобное несколько лет назад и могу дать несколько общих советов, которые могут оказаться полезными.
Прежде всего, разработка приложения с такой «многопользовательской» не имеет ничего общего с самим шаблоном MVC. Вы можете сделать это без MVC: D. Во-вторых, если веб-сайты должны работать с различными бизнес-доменами, я боюсь, что нет общего способа сделать то, что вы хотите. В моем случае это был просто ряд платформ электронной коммерции.
В любом случае, подумайте о следующих вещах.
1. Подумайте об использовании подхода поддомена, если можете. Это избавит вас от глупых маршрутов и махинаций. По сути, вы можете сопоставить *.yourdomain.com
с одним приложением и легко обрабатывать необходимую логику, связанную с арендатором. Так что в моем случае это было приложение, которое вело себя по-разному, в зависимости от предоставленного URL, не маршрута, а поддомена, например, 'superclient.yourdomain.com'
. Это не всегда возможно или хорошая идея, но подумайте об этом.
2.Внедрение зависимости везде. Ну, в общем, это полезно, но в вашем случае это абсолютно необходимо - попробуйте абстрагировать любую специфичную для арендатора логику в отдельных типах и инициализировать их в одном месте. Все, что связано с локализацией, настройками часового пояса, темой приложения, информацией о брендинге в заголовке приложения и т. Д. Просто инициализируйте и вставьте, где это необходимо. Если у вас есть что-то вроде
if (website1) {
showBlockOne();
} else if (website2) {
showBlockTwo();
} else if (website3) {
showBlockThree();
}
тогда вы делаете что-то не так, это путь к безумию. Это должно быть что-то вроде
_currentTenantViewContext.ShowBlock()
;
Так что его полиморфизм над условными операторами в большинстве случаев.
3. В моем случае требовалось создать приложение, которое могло бы работать на любом языке, поэтому мне пришлось решать эту проблему и на стороне базы данных. Проблема в том, что если обычно у вас есть, например, таблица ProductType
в базе данных с Id
и Name
, то в многопользовательском приложении это не так просто. Моим решением было создать две таблицы - ProductType
с полями Id и Code
и таблицу ProductTypeLocalization
с полями Id, ProductTypeId
, LanguageId
, Value
для решения этой проблемы. Также требовалось сделать эти значения редактируемыми из панели администратора ...
Я не знаю, так ли это для вас, но если да, подумайте об этом, прежде чем дерьмо ударит в вентилятор в будущем.
4.Для ситуаций, когда вам нужны определенные поля в таблице базы данных только для одного сайта, не рекомендуется свободно создавать их (в общем). Подумайте об использовании некоторого общего формата для этого, например, JSON или XML. Если у вас есть несколько дополнительных текстовых полей для определенного веб-сайта в некоторой таблице, просто создайте одно поле (назовите его ExtraSettings или что-то в этом роде) и сохраните эти строки как JSON в этом одном поле. Конечно, вы должны обрабатывать эти данные по-разному, но это снова связано с внедрением зависимостей.
Также вы можете использовать NoSQL для этого.
5.Предоставление функций, для разных веб-сайтов требуется отображать разные блоки, применять правила и т. Д. Вы должны иметь какой-либо способ их включения / выключения для определенного веб-сайта (арендатора) без перекомпиляции / повторного развертывания.
Надеюсь, это поможет.