Кажется маловероятным, что я могу ссылаться на код в сборке моего веб-приложения 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 в корзину как обычно.
Но со всеми этими различными подходами я обходил первоначальное требование - иметь возможность настраивать плагины на лету без использования IDE и без необходимости вручную компилировать приложение.
Так что, в данном случае, действительно ли использование App_Code так плохо, и он вернется, чтобы укусить меня? ...