Добавление ссылок на ASP MVC Engine Compilation Engine - PullRequest
1 голос
/ 02 июня 2009

Я написал плагиновое решение для приложений ASP MVC, основанное на совете, найденном на этом сайте, однако я достиг контрольно-пропускного пункта и был бы признателен за некоторую помощь. Не вдаваясь слишком глубоко в то, как работает система плагинов, она успешно загружает контроллер и находит его соответствующее представление - проблема в том, что представление не компилируется, потому что оно не может разрешить все ссылки плагина (библиотека плагина имеет ссылки на другие DLL, о которых хост-приложение не знает).

Я использую AssemblyResolve для CurrentDomain, но он не вызывается, когда BuildManager по умолчанию компилирует представление, вместо этого он берет список сборок из раздела web.config. Если я добавлю все файлы плагинов в GAC и добавлю ссылку в этот раздел - все работает нормально. Но это противоречит цели иметь систему плагинов, если мне нужно изменить web.config для каждого плагина.

Небольшая иллюстрация, объясняющая проблему: Plugin.dll - Ссылки -> PluginServices.dll

URL http://mysite.com/some/index Приложение MVC --load -> Plugin.dll PASS

Приложение MVC --load -> Plugin.SomeController PASS

Приложение MVC --find -> Plugin \ Views \ Some \ Index.aspx PASS

Приложение MVC --compile -> Index.aspx FAIL (представление использует тип из PluginServices, который не может быть найден)

Есть ли способ динамически добавлять ссылки на BuildManager, чтобы компиляция проходила без изменения web.config?

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 04 июня 2009

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

Мне, однако, удалось заставить его работать. Что я должен был сделать, это следующее: 1) зарегистрировать DLL плагина в GAC

2) добавить ссылку на DLL в web.config хоста в разделе «compilation»

3) убедитесь, что все представления в плагине не используют атрибут «наследовать» для строгой типизации представления, вместо этого я создаю локальную переменную и приведу модель к соответствующему типу.

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

Опять же, я не уверен, как кто-то может утверждать, что у него есть система плагинов для MVC, и он не имел дело с простым view.aspx, который имеет следующую строку: <% = Model.Name%>, где Model - это объект, который хозяин знает о.

Еще раз спасибо за все ваши ответы!

0 голосов
/ 02 июня 2009

Я думаю, вы не хотите, чтобы ваш хост-проект компилировал dll плагина. Я думаю, что вы хотите, чтобы плагины были собраны заранее и, возможно, встраивали представления в dll сборки - таким образом, вы можете создавать соответствующие интерфейсы [Robert Harvey et al] и позволить хост-приложению полагаться на тот факт, что динамически загружаемые сборки в порядке. Возможно, вам нужно также создать решение для использования подключаемого модуля, в котором вы (модуль?) Тестируете подключаемый модуль как его разработанный / скомпилированный - это кажется необходимым, поскольку некоторые ошибки компиляции в представлениях не отображаются сразу ( этот пост также должен помогите с ошибками компилятора во взглядах - у меня сработало).

0 голосов
/ 04 июня 2009

Gil,

Посмотрите на следующую статью. В нем объясняется, как использовать Reflection для получения информации о сборке бизнес-уровня во время выполнения, а затем использовать InvokeMember для вызова нужного метода. Для работы не требуется никакой регистрации; вам просто нужен путь к вашей сборке.

C # Отражение и динамический вызов метода
http://my.execpc.com/~gopalan/dotnet/reflection.html

0 голосов
/ 02 июня 2009

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

Эта статья поможет вам начать работу.

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