Что следует учитывать при разработке многопользовательского приложения asp.net MVC?

Добрый день. У меня сегодня довольно общий вопрос. Мне было поручено создать веб-приложение для управления базовой информацией о клиентах. Это очень простое приложение, но то, что я не знаю, это то, что нужно иметь в виду, чтобы развить сайт вокруг поддержки нескольких пользователей в своих собственных доменах или поддоменах нашего URL?

Как я могу запретить пользователям регистрироваться в каждой части приложения?

Я видел упоминание о масштабах базы данных в похожих вопросах в Stack Overflow, может ли кто-нибудь подробно описать лучшие практики для такой реализации?

Есть ли какие-либо новые функции в MVC3 для поддержки многопользовательской аренды? Я столкнулся с этой проблемой с MVC2 и моим сайтом электронной коммерции, где мы решили, что хотим, чтобы он был белого цвета и настраивался для нескольких владельцев магазинов, и не знаю с чего начать реализацию этих функций в существующем приложении. Любой вход оценивается.

изменить

Чтобы подробно рассказать о многопользовательской аренде, я имею в виду, например, в контексте магазина несколько пользователей подписываются на свой собственный магазин на сайте www.mystore.com и каждому из них предоставляется уникальный субдомен для доступа к их собственному экземпляру магазин, на user1.mystore.com, user2.mystore.com и т.д. В каждом магазине будут клиенты с историями заказов, и у этих клиентов будут логины. Мне нужно было бы запретить пользователям user1.mystore.com входить в систему на user2.mystore.com без новой учетной записи, а также запрещать пользователю user2.mystore.com доступ к истории клиентов user1.mystore.com.

Ответ 1

Я реализовал полное приложение MVC multi-tennant. Вот некоторые ссылки, которые я нашел удобными и некоторые примеры приложений:

http://msdn.microsoft.com/en-us/library/aa479086.aspx

http://codeofrob.com/archive/2010/02/14/multi-tenancy-in-asp.net-mvc-controller-actions-part-i.aspx

http://www.developer.com/design/article.php/10925_3801931_2/Introduction-to-Multi-Tenant-Architecture.htm

http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_cc

http://lukesampson.com/post/303245177/subdomains-for-a-single-application-with-asp-net-mvc

http://code.google.com/p/multimvc/

http://www.paulstovell.com/widgets

http://www.agileatwork.com/bolt-on-multi-tenancy-in-asp-net-mvc-with-unity-and-nhibernate/

http://ayende.com/blog/3530/multi-tenancy-approaches-and-applicability

http://weblogs.asp.net/zowens/archive/tags/Multi-tenancy/default.aspx

http://cloudsamurai.codeplex.com/

http://cloudninja.codeplex.com/

http://msdn.microsoft.com/en-us/library/hh534484.aspx

http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx

http://blog.tonywilliams.me.uk/asp-net-mvc-2-routing-subdomains-to-areas

Даже начиная с нуля, вы находитесь в мире боли. Структура MVC очень мало помогает вам решить проблемы.

Ответ 2

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

Первый шаг заключается в том, что вы создадите таблицу для размещения своего списка "Арендатор". Затем вам нужно добавить этот TenantId примерно в каждую таблицу в вашей системе, чтобы убедиться, что никто не наступает друг на друга. Вы можете пропустить любые таблицы, которые являются глобальными по своей природе. Одним из примеров может быть список кодов состояния.

Однако все, от пользователей до данных, которые у них есть и т.д., должно будет иметь этот идентификатор. Кроме того, измените все ваши индексы, чтобы принять во внимание tenantid.

После этого вам нужно будет изменить все ваши запросы, чтобы принять во внимание tenantid.

Один столбец таблицы арендаторов должен быть URL-адресом портала. Как customername.oursite.com или что-то еще. Таким образом, вы можете указать несколько URL-адресов на один и тот же код. Когда сайт должен использовать текущий tenantid, просто посмотрите его на основе URL-адреса, который был передан.

Если бы я это делал, я планировал потратить от 1 до 2 часов на таблицу в базе данных, чтобы сделать ее "мульти-арендатором". Очевидно, что некоторые таблицы (и их запросы) будут идти быстрее; другие займут больше времени.

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

Как правило, вы разрабатываете для этого в начале проекта. Установка уже (или почти) полного проекта - это PITA.

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

Ответ 3

В Sharp Architecture (на основе MVC 3) есть несколько разговоров о многоуровневой поддержке: http://www.yellowfeather.co.uk/2011/02/multi-tenancy-on-sharp-architecture-revisited/

Не уверен, что это действительно поможет вам с вашим существующим приложением, портирование будет немного работой.