Приложение Multi Tenant MVC 3 с проблемой модели представления - PullRequest
0 голосов
/ 09 мая 2011

Я пишу приложение, которое использует мультитенантность, как обрисовано в общих чертах Заком Оуэнсом .

В примере с Заком у него есть отдельные библиотеки классов c # для хранения контроллеров и представлений для каждого арендатора. Поскольку я не использую движок Spark View, который имеет скомпилированные представления, это не вариант. Вместо этого я создал отдельный проект приложения MVC3 для каждого арендатора, и там я храню контент, контроллеры, представления и т. Д.

У меня есть основной проект приложения MVC (который является приложением для запуска) с настраиваемой фабрикой контроллеров, которая сканирует сборки, аналогичные примеру Zacks, и настраивает внедрение зависимостей, используя карту структуры. У меня есть движок представления, который использует контекст контроллера для получения правильного представления. Если он не может найти представление или зависимость в приложении арендаторов, он будет использовать представление или зависимость из нашего основного проекта приложения MVC. Все работает потрясающе, кроме когда дело доходит до моделей представления.

Большинство (если не все) наших представлений передаются модели представления. Я хотел бы, чтобы класс View Model находился в проекте приложения арендатора, а не в проекте основного приложения, чтобы у арендаторов могли быть пользовательские модели представления, соответствующие их собственным представлениям.

Кажется, что это будет работать, но я продолжаю получать ошибки.

Сценарий # 1 - Модели представлений по умолчанию находятся в основном проекте приложения MVC. Приложение Tenant имеет ссылку на Основное приложение и поэтому может использовать модели просмотра по умолчанию. Нет проблем. Теперь, когда я хочу добавить модель представления или переопределить модель представления, я создаю класс и помещаю его в приложение арендатора. Проблема заключается в том, что при вызове страницы основное приложение MVC не может найти новую модель представления, поскольку нет ссылки из основного приложения на приложение Tenant, и они не могут быть связаны с проблемами циклических ссылок.

Сценарий # 2 - Я удаляю ссылку из Приложения Арендатора на Основное Приложение. Затем я копирую модели представления по умолчанию из Основного приложения в Приложение Tenant, изменяю пространства имен и создаю ссылку из Основного приложения на Приложение Tenant, чтобы классы модели представления были доступны Основному приложению.

Затем я запускаю его и получаю следующую ошибку:

Элемент модели, передаваемый в словарь, имеет тип 'Sample.Models.Login', но для этого словаря требуется элемент модели типа 'Sample.Models.Login'.

Ошибка имеет смысл, но не совсем. У меня есть только один класс с именем Sample.Models.Login

У меня есть некоторые предположения о том, почему это может делать это, но я не могу понять это. Любые советы или рекомендации будут с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 30 августа 2011

Не уверен, что понимаю, но я все равно пойду.

Прежде всего, если вам нужны разные модели представлений, скорее всего, у вас должен быть другой контроллер / действие. Возможно, вы просто хотите добавить дополнительную информацию - в этом случае настроенная модель представления должна основываться на исходной модели представления. Проблемы с круглыми ссылками можно получить, переместив модели основного вида в отдельную сборку. Вы также можете управлять ссылочными проблемами с помощью инфраструктуры плагинов, такой как Managed Extensibility Framework.

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

Тем не менее, один арендатор может иметь мини-корзину вверху каждой страницы, например, в то время как другие арендаторы этого не делают, так что вы могли бы подумать, что им нужны пользовательские модели представления для включения данных корзины. Однако лучшим способом сделать это было бы просто изменить главную страницу этого арендатора, чтобы он включал, например, вызов @ Html.RenderAction («мини-корзина») (в Razor), и это действие будет отвечать за выборку дополнительной данные корзины.

И, кроме того, если вы хотите скомпилировать свои представления, как предложил Адам, дополнительной опцией было бы взглянуть на RazorGenerator .

...