ASP.NET Core 2.0 - 导入外部程序集视图的选项

时间:2018-01-29 16:45:43

标签: asp.net-core asp.net-core-2.0

项目结构

该解决方案包含以下项目:

Cms

Sdk:Microsoft.NET.Sdk

输出类型:Library

包含:IServiceCollectionExtensionsIWebHostBuilderExtensions,TagHelpers,中间件和其他基础架构代码。

Cms.Web

Sdk:Microsoft.NET.Sdk.Web

输出类型:Exe

包含:用于CMS'页面的Razor页面,控制器,视图,wwwroot

Cms.Manual

Sdk:Microsoft.NET.Sdk.Web

输出类型:Exe

包含:用于CMS手册的Razor页面,控制器,视图,wwwroot。

这是一个使用CMS的示例项目。

问题

Cms.Manual.Startup

public void ConfigureServices(IServiceCollection services)
{
    services.AddCms();
}

Cms.Services.IServiceCollectionExtensions

public static IServiceCollection AddCms(this IServiceCollection services)
{
    // other code

    var assembly = typeof(Cms.Web.Pages.IndexModel).GetTypeInfo().Assembly;
    services
        .AddMvc()
        .AddApplicationPart(assembly)
        .AddControllersAsServices();

    return services;
}

这会导致异常,因为无法找到DLL。我认为这是因为我对.Exe输出项目的构建过程的某些部分一无所知。

我已经验证了项目间的参考:全部按顺序排列。

其他尝试

将视图改为Cms项目,使用EmbeddedFileProvider为其提供服务。

这很有效,但是从现在开始嵌入所有.cshtml,.js和.css文件,如果样式或内容错误,我将不得不重新编译。这使得该项目的UI开发部分停滞不前。

我能想到的其他解决方案

Cms.Web中的网页开发,使用上述嵌入文件,但添加某种构建操作以自动将文件从Cms.Web移动到Cms

目标

我想实现两件事:

  • 让消费者感到轻松:只需.UseCms()而不是其他
  • 从消费的ASP.NET Core项目中的另一个程序集中提供MVC

解决方案是什么?我会接受一种绕过例外的方法。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用我的书架

AUR.NETCore.Mvc.PluginsManager

选择一个包含程序集的文件夹

使用或扩展AUR.NETCore.Mvc.PluginsManager.interfaces.IPluginBase,它是插件的接口

然后必须将其添加到ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    Plugins.Load(services); // last row
}

请记住必须设置外部插件程序

public ViewsTypeResouces ViewsTypeResouces { get => ViewsTypeResouces.Assembly; }

您将在文档中找到所有内容