A plugin framework with ASP.NET MVC3 and embedded Razor views

前端 未结 6 544
小鲜肉
小鲜肉 2020-12-12 17:32

I\'m designing a plugin framework for ASP.NET MVC3 using Razor views, and I\'m having an issue getting the embedded views to work correctly.

The plugin frame

6条回答
  •  旧时难觅i
    2020-12-12 18:14

    Ok, the solution was found using this article.

    First I create a class with a PreApplicationStartMethod. This method scans the plugin folder and copies the dlls to the AppDomain.DynamicDirectory.

    Then each of these dll's are loaded using BuildManager.AddReferencedAssembly.

    And voilà, the strongly-typed Razor views compile beautifully. See the code here:

    [assembly: PreApplicationStartMethod(typeof(MySolution.PluginHandler.PluginActivator), "Initialize")]
    namespace MySolution.PluginHandler
    {
        public class PluginActivator
        {
            private static readonly DirectoryInfo PluginFolderInfo;
    
            static PluginActivator() {
                PluginFolderInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/plugins"));
            }
    
            public static void Initialize() {
                CopyPluginDlls(PluginFolderInfo, AppDomain.CurrentDomain.DynamicDirectory);
                LoadPluginAssemblies(AppDomain.CurrentDomain.DynamicDirectory);
            }
    
            private static void CopyPluginDlls(DirectoryInfo sourceFolder, string destinationFolder)
            {
                foreach (var plug in sourceFolder.GetFiles("*.dll", SearchOption.AllDirectories)) {
                    if (!File.Exists(Path.Combine(destinationFolder, plug.Name))) {
                        File.Copy(plug.FullName, Path.Combine(destinationFolder, plug.Name), false);
                    }
                }
            }
    
            private static void LoadPluginAssemblies(string dynamicDirectory)
            {
                foreach (var plug in Directory.GetFiles(dynamicDirectory, "*.dll", SearchOption.AllDirectories)) {
                    Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(plug));
                    BuildManager.AddReferencedAssembly(assembly);
                }
            }
        }
    }
    

    I hope this can help other programmers that want to create a clean plugin framework using these new technologies.

提交回复
热议问题