ASP.NET MVC с использованием каталога App_Code

Я добавил каталог App_Code в свой проект ASP.NET MVC, чтобы получить динамическую компиляцию для плагинов.

Только небольшое раздражение заключается в том, что при разработке новых плагинов я не получаю intellisense для классов внутри каталога App_Code.

В настоящее время я создаю их в другом каталоге внутри своего проекта, а затем копирую в App_Code.

есть ли способ обойти это?

[Обновлять]

Я разместил «ответ» ниже. Технически это отвечает на вопрос, поскольку на основе моей собственной спецификации использование инструментов (например, intellisense) не требуется для создания плагинов. Однако это вызвало вопрос о том, как я могу создать динамически скомпилированную структуру плагинов без использования App_Code. Поскольку этот вопрос так сильно отличается от оригинала, я подниму его отдельно.


person Ben Foster    schedule 16.03.2010    source источник


Ответы (4)


Вы можете попробовать изменить файлы «Действие сборки» в свойствах с «Компилировать» на «Содержимое». Затем они будут скомпилированы как веб-сайт. В статье ниже это объясняется:

http://vishaljoshi.blogspot.co.uk/2009/07/appcode-folder-doesnt-work-with-web.html

person Jenninha    schedule 18.09.2012
comment
В моем случае мне пришлось перейти с Content на Compile - person Oscar Ortiz; 24.02.2015

ASP.NET MVC использует проект веб-приложения в отличие от веб-сайта. Необходимо скомпилировать проект веб-приложения. Каталог App_Code не имеет смысла в таком типе приложений.

person Darin Dimitrov    schedule 16.03.2010
comment
@Darin, я понимаю разницу между типами проектов, но это дело VS, а не время выполнения. Причина использования каталога App_Code заключается в том, что я хочу, чтобы люди могли легко добавлять плагины, без необходимости открывать приложение в VS / VWDE, добавлять плагин и перекомпилировать. Он также предлагает то преимущество, что люди могут писать плагины на предпочитаемом им языке, будь то C #, vb.net или ruby. Неужели использование App_Code - такая плохая вещь? Так работают такие приложения, как BlogEngine, и это здорово с точки зрения расширяемости. - person Ben Foster; 16.03.2010
comment
Я добавил отрицательный голос, потому что использовал каталог App_Code в веб-приложении MVC. Причина, по которой мне это было нужно, заключалась в том, чтобы переопределить VirtualPathProvider при развертывании в IIS6. Мне не удалось найти исходную документацию, но этот пост содержит некоторую информацию: sunali.com/2008/01/09/ - person Bertvan; 10.09.2012

Кажется маловероятным, что я могу ссылаться на код в моей сборке веб-приложения MVC из App_Code во время разработки. Я считаю, что это просто природа проектов веб-приложений в Visual Studio и тот факт, что код в каталоге App_Code компилируется в другую сборку.

В моем первоначальном вопросе я объяснил, что хотел использовать App_Code из-за его возможностей динамической компиляции. Думая о моих требованиях к расширяемости, тот факт, что свойство intellisense не работает, не должен вызывать беспокойства, поскольку все дело в том, что IDE не требуется для разработки плагинов - если бы я собирался открыть Visual Studio для их разработки. Я также могу использовать библиотеки классов.

Итак, думая об архитектуре моих плагинов, меня устраивает идея определения моих плагинов (http://weblogs.asp.net/justin_rogers/articles/61042.aspx), и я могу автоматически загружать плагины в определенный каталог, например:

            var assemblies = new List<Assembly>();
        var di = new System.IO.DirectoryInfo(Server.MapPath("~/Plugins"));

        di.GetFiles("*.dll").ToList().ForEach(x => {
            assemblies.Add(Assembly.LoadFrom(x.FullName));
        });

        List<Plugin> ExternalPlugins =
            Plugin.InitializePlugins(assemblies).ToList();

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

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

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

Итак, в этом случае, действительно ли использование App_Code так плохо, и он вернется, чтобы укусить меня? ...

person Ben Foster    schedule 23.03.2010

Есть ответ. По крайней мере, для MVC3. Не открывайте раствор как раствор. Откройте его как веб-сайт из локального IIS (при условии, что вы его запускаете именно так). Затем вы увидите, что ваш динамический код app_code отображается с помощью intellisense. Но вы не сможете перейти к другим библиотекам кода, которые находятся вне. Для этого вам понадобится еще один экземпляр studio и open.

person Brian White    schedule 19.04.2012