Search code examples
pluginsmoduleasp.net-core-2.1

Loading Razor Class Libraries as plugins


When using Razor Class Libraries with ASP.net core 2.1, if I add reference to the class library, it loads controllers, and views as expected. But the question is, how can I load this modules dynamically at runtime? I want to put modules at directory, which are not referenced at design time, and load them at the start up of the app. I tried to use Application Parts. But that way, controllers are loaded, but views are not discovered.


Solution

  • I had completely forgot about CompiledRazorAssemblyPart.

    What we need to do is:

    services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .ConfigureApplicationPartManager(ConfigureApplicationParts);
    

    and configure the parts like this

        private void ConfigureApplicationParts(ApplicationPartManager apm)
        {
            var rootPath = HostingEnvironment.ContentRootPath;
            var pluginsPath = Path.Combine(rootPath, "Plugins");
    
            var assemblyFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);
            foreach (var assemblyFile in assemblyFiles)
            {
                try
                {
                    var assembly = Assembly.LoadFile(assemblyFile);
                    if (assemblyFile.EndsWith(".Views.dll"))
                        apm.ApplicationParts.Add(new CompiledRazorAssemblyPart(assembly));
                    else
                        apm.ApplicationParts.Add(new AssemblyPart(assembly));
                }
                catch (Exception e) { }
            }
        }