Мультитенантное приложение для обмена данными (Asp net mvc + Entity Framework + Sql Server) - PullRequest
6 голосов
/ 12 ноября 2010

Я разрабатываю мультитенантную архитектуру приложений, которая является довольно сложной.

.

3 совершенно другого типа приложений

не только один тип приложения, используемого многими клиентами;Есть 3 различных вида приложений.

APP A, APP B, APP C

.

Каждое приложение является мультитенантным

Каждое приложение имеет своих клиентов.

APP A - клиент A1 - клиент A2

APP B - клиент B1 - клиент B2

APP C - клиент C1 - клиент C2

.

ОБЩАЯ ИНФОРМАЦИЯ

Многие сведения передаются между различными приложениями

"клиент А1" необходимо манипулировать или просматривать только данные, принадлежащие клиенту "C1 "

.

ВОПРОС

Учтите, что я использую Asp net mvc, EF, Sql Server.Какая правильная реализация?

Один сайт и много областей?Создать несколько сайтов?Несколько дБ?Только один дб?Фильтрация?Sql отфильтрованный вид?...

Какой-то пример приложения?

РЕДАКТИРОВАТЬ

и ... Где разместить бизнес-логику?

Ответы [ 5 ]

2 голосов
/ 21 января 2011

Я бы порекомендовал вам сначала создать собственный многопользовательский стек разработки (Framework) поверх .Net, который будет отвечать всем требованиям многопользовательского режима с точки зрения изоляции данных арендатора, поддержки горизонтального масштабирования, фильтрации представления на основе контекста и роли пользователя, расширения модели данных для клиента, настройки пользовательского интерфейса для клиента, применения ограничений доступа на основе ролей, привилегий и области данных - которые могут различаться для разных клиентов и т. д.

Бизнес-логика может быть построена поверх этой платформы. Такой подход обеспечит вашему продукту надежную и прочную техническую базу.

Другой альтернативой является покупка готового к использованию многопользовательского инженерного стека с полки, установка его в Visual Studio и использование его в качестве шаблона разработки.

0 голосов
/ 20 января 2011

Я предлагаю использовать PRISM с Sliverlight и MVVM design patten. PRISM разработан для такого рода составного приложения, где каждое приложение является независимым и может также взаимодействовать друг с другом через События, представленные PRISM.

0 голосов
/ 01 декабря 2010

Это конкретный ответ, но только некоторые некоторые аспекты, которые вы можете учитывать при разработке этого.

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

Пример:

Read Only|cust1|cust2|cust3
---------+-----+-----+-----
customer1| 1   | 1   | 0
customer2| 0   | 1   | 0
customer3| 1   | 0   | 1

Write    |cust1|cust2|cust3
---------+-----+-----+-----
customer1| 1   | 1   | 0
customer2| 0   | 1   | 0
customer3| 0   | 0   | 1

Итак, в приведенном выше примере customer1 может читать и записывать (обновлять) данные customer2.

При этом основной проблемой является моделирование этих отношений, то есть общей информации.Используя предложение @ TFD, эти отношения могут быть загружены в сеанс, когда клиент входит в систему вместе с соответствующими идентификаторами арендаторов.

(Исходя из предоставленной информации, я склоняюсь к тому, что это может касаться приложения, а не клиента. Чтобы проиллюстрировать это, замените значения 'cust' в приведенных выше таблицах на App.)

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

Возможно, необходима другая база данных конфигурации, если есть другие перекрестные данныеотношения.БД будет хранить всю информацию об арендаторе (включая связи с другими приложениями) для каждого приложения.Причина этого предположения заключается в том, что, как я вижу, у вас есть три отдельных мультитенантных приложения, независимых друг от друга с использованием подхода с общей базой данных, но каждое приложение должно взаимодействовать с другим приложением на некотором уровне.
С точки зренияклиентам в БД, я бы тогда предложил, чтобы таблица «Клиенты» была ограничена БД Config.После этого вы можете создать базу данных контента на основе требований каждого приложения.

0 голосов
/ 03 декабря 2010

У вас может быть несколько подходов - поскольку приложение управляется данными, имеет смысл создать структуру базы данных, которая защищает данные даже в случае ошибок приложения.

Один из способов сделать это - обеспечить наличие хранимых процедур для доступа к любым таблицам, а логика безопасности встроена в хранимые процедуры. Вы можете убедиться, что разные имена пользователей базы данных используются для каждого клиента и что это имя пользователя базы данных сопоставлено с этим идентификатором клиента в таблице сопоставления. Тогда у сохраненных процедур всегда может быть проверка того, что запрашиваемые / измененные данные действительно принадлежат идентификатору клиента, сопоставленному с пользователем БД, который выполняет процедуру (используя контекстную информацию).

Тогда вам понадобится какой-то способ убедиться, что созданное приложением соединение с БД использует только соответствующее имя пользователя, которое сопоставляется с этим идентификатором клиента. Это означает, что вам нужен еще один хранимый процесс, который дает вам эту информацию (возможно, с именем пользователя / идентификатором в качестве входных данных), и этот хранимый процесс должен быть выполнен через общее имя пользователя db. Помните, что это единственный хранимый процесс, который должен иметь привилегии выполнения, предоставленные этому обычному пользователю БД.

Это может выглядеть как написание кучки дополнительного кода, но это действительно помогает знать, что ваша БД будет отклонять плохие запросы даже из-за ошибок приложения. Единственное место, где вы должны быть очень, очень осторожны, это место, где вы получаете правильное имя пользователя и пароль для этого идентификатора, и это должно быть вполне возможно.

0 голосов
/ 01 декабря 2010

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

Но в любом случае вы должны убедиться, что ВСЕ функции базы данных используют правильное подключение к базе данных или ключ столбца клиента.Это реальная проблема

Чтобы убедиться в этом, нужно иметь только функцию ONE на приложение, которое принимает это решение, и убедиться, что все функции базы данных не работают, если они не вызвали этофункция (прямо или косвенно, как показано ниже)

например, с помощью MVC в функциях global.asax AuthenticateRequest или BeginRequest вы можете проверить, кто пользователь, а затем рассчитать, какое соединение с базой данных ему нужно использовать или какой ключ столбца арендатора онидолжен использовать в КАЖДОМ запросе для этого запроса.Затем он сохраняется в переменной сеанса и т. Д.

Если у вас есть три приложения, я бы создал три отдельных сайта.Они могут делиться общими классами через общий проект.Жизнь, как правило, проще, если они могут быть развернуты отдельно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...