Я работаю над системой плагинов, которая работает с MVC3, библиотеки DLL находятся в каталоге ~ / Plugin /. Пока что все работает отлично и модно, так как хосты находят модели и контроллеры, а представления должным образом встроены в библиотеки DLL. Единственная проблема заключается в том, что представления не могут быть скомпилированы механизмом Razor.
Модели и контроллеры добавляются на этапе инициализации приложения следующим образом:
[assembly: PreApplicationStartMethod(typeof(Dashboard.PluginReader), "Initialize")]
namespace Dashboard
{
public class PluginReader
{
public static void Initialize()
{
foreach (string plugin in Directory.GetFiles(HostingEnvironment.MapPath("~/Plugin"), "*.dll", SearchOption.AllDirectories))
{
Assembly assembly = Assembly.LoadFile(plugin);
BuildManager.AddReferencedAssembly(assembly);
}
}
}
}
Для разрешения представлений я использую VirtualFile и VirtualPathProvider, которые возвращают запрошенный ресурс в виде потока:
class AssemblyResourceVirtualFile : VirtualFile
{
string path;
public AssemblyResourceVirtualFile(string virtualPath)
: base(virtualPath)
{
path = VirtualPathUtility.ToAppRelative(virtualPath);
}
public override System.IO.Stream Open()
{
// /~Plugin/path.of.dll/path.of.razor.view
string[] parts = path.Split('/');
string assemblyName = parts[2];
string resourceName = parts[3];
string path = HostingEnvironment.MapPath("~/Plugin") + "/"+ assemblyName;
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(path);
if (assembly != null)
{
Stream resourceStream = assembly.GetManifestResourceStream(resourceName);
return resourceStream;
}
return null;
}
}
Когда Razor компилирует их, он возвращает исключение, так как не может найти ссылки, такие как ViewBag. У кого-нибудь есть идеи о том, как заставить работать эти встроенные ресурсы, или знаете существующую систему плагинов?