Asp.net core 在.NETCore2.1中动态包含预编译(Razor)视图

Asp.net core 在.NETCore2.1中动态包含预编译(Razor)视图,asp.net-core,.net-core,asp.net-core-mvc,asp.net-core-2.0,Asp.net Core,.net Core,Asp.net Core Mvc,Asp.net Core 2.0,创意 我正在尝试构建一个模块化的.NET核心MVC应用程序,我可以通过将所需的库复制到预定义的文件夹来添加“模块”(扩展)。应用程序定义了一组依赖项(DI)、错误处理和基本布局;这些模块提供实际的应用程序或页面逻辑 我们已经建立了一个概念证明,使用-这个概念非常有效,自动添加控制器,“普通”视图很容易识别(设置为“嵌入式资源”的视图) 挑战 但是,我不喜欢将视图设置为“嵌入式资源”,因为它会对性能造成很小的影响,因为Razor页面现在是在运行时构建的 我们所尝试的 由于.NET Core 2.1

创意
我正在尝试构建一个模块化的.NET核心MVC应用程序,我可以通过将所需的库复制到预定义的文件夹来添加“模块”(扩展)。应用程序定义了一组依赖项(DI)、错误处理和基本布局;这些模块提供实际的应用程序或页面逻辑

我们已经建立了一个概念证明,使用-这个概念非常有效,自动添加控制器,“普通”视图很容易识别(设置为“嵌入式资源”的视图)

挑战
但是,我不喜欢将视图设置为“嵌入式资源”,因为它会对性能造成很小的影响,因为Razor页面现在是在运行时构建的

我们所尝试的
由于.NET Core 2.1现在能够创建,因此我创建了一个引用了
的项目,并将其编译为Razor库(*.Views.dll)

当我在(主)应用程序中将Razor视图库链接为项目依赖项时,一切正常。但是,我们的目标仍然是使应用程序完全即插即用,并且只需将库部署到文件夹中,就可以包含库

我试图通过使用
PhysicalFileProvider
扩展Razor视图引擎来实现这一点,但它无法识别库中的视图

services.Configure(opt=>
{
添加(新的PhysicalFileProvider(“path/to/extension”);
});
结果总是出现异常,告诉我找不到
/Views/[controller]/[action].cshtml

在搜索我遇到的其他答案时,这个项目创建了一个
ViewLocationExpander
。我试图实现这个想法的各种版本,但运气不佳——很可能是因为这是一个基于.NETCore1.x的旧概念,它仍然使用项目依赖关系;尽管Razor视图引擎现在搜索程序集的名称空间

services.Configure(opt=>
{
添加(新的PhysicalFileProvider(“路径/到/扩展”);
添加(新的DynamicLocationExpander());
});
其中
DynamicLocationExpander
如下所示:

公共类DynamicLocationExpander:IViewLocationExpander
{
公共DynamicLocationExpander()
{
}
public void PopulateValues(ViewLocationExpanderContext上下文)
{
}
公共IEnumerable ExpandViewLocations(ViewLocationExpanderContext上下文,IEnumerable viewLocations)
{
字符串程序集=((ControllerActionDescriptor)context.ActionContext.ActionDescriptor)
.ControllerTypeInfo.AsType().Assembly.GetName().Name;
foreach(视图位置中的var viewLocation)
产生返回$“{assembly}/{viewLocation}”;
}
}
问题

我们如何将包含预编译视图的Razor视图库动态链接到(父)应用程序中的Razor引擎?

我知道,我参加聚会有点晚,但如果您仍然需要答案,请看我的问题:这是否回答了您的问题?