Система плагинов MVC3 - PullRequest
       2

Система плагинов MVC3

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

Я работаю над системой плагинов, которая работает с 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. У кого-нибудь есть идеи о том, как заставить работать эти встроенные ресурсы, или знаете существующую систему плагинов?

Ответы [ 2 ]

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

Ответ

Если вы хотите создать такой плагин, просто сделайте следующее:

И, наконец, поместите это в Application_Start ().

    protected void Application_Start()
    {
        foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            // As you can see, it checks if the assembly has plugin in it's name
            // If you want something more solid, replace it at will
            if (assembly.ManifestModule.Name.ToLower().Contains("plugin"))
            {
                BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly);
            }
        }

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
0 голосов
/ 25 августа 2011

Следующий пост выглядит очень полезным для этого http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/

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