5

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.

Zoe
  • 27,060
  • 21
  • 118
  • 148
Vahid Rassouli
  • 296
  • 2
  • 10

1 Answers1

5

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) { }
        }
    }
Zoe
  • 27,060
  • 21
  • 118
  • 148
Vahid Rassouli
  • 296
  • 2
  • 10
  • I haven't tried your solution yet, but I'm curious as to how do you handle dependencies of your Razor Class Library? Do you copy all DLLs your RCL depends on into the same folder? Thanks. – Ray Jul 08 '19 at 19:05