2

插件 UI 是在一个单独的 MVC 项目中开发的,而 CMS 12 在另一个项目中。以下是一个测试解决方案,只是为了解释我们遇到的问题。 解决方案结构

请考虑以下

  1. TestAddon 项目是一个具有基本 UI 的简单 MVC 项目。我们需要在 CMS 12 管理菜单中呈现此 UI。我们还创建了一个菜单提供程序。
  2. 然后构建 TestAddon 项目并将 DLL 复制到 CMS-> bin 文件夹。
  3. 创建 module/_protected 文件夹并添加 TestAddon/TestAddon.zip
  4. module.config 是按照文档中的描述创建的(https://world.optimizely.com/documentation/developer-guides/CMS/configuration/Configuring-moduleconfig/
    <module productName="TestAddon" loadFromBin="false" tags="EPiServerModulePackage" clientResourceRelativePath="1.0.0">
      <assemblies>
        <add assembly="TestAddon" />
      <add assembly="TestAddon.Views" />
      </assemblies>
    
      <route url="{controller}/{action}" > 
        <defaults>
          <!--<add key="moduleArea" value="TestAddon" />-->
          <add key="controller" value="CustomAdminPage" />
          <add key="action" value="Index" />
        </defaults>
      </route>
    
      <clientResources>
        <!-- <add name="myscript" path="ClientResources/index.js" resourceType="Script" ></add> -->
      </clientResources>
    
    
      <clientModule>
        <moduleDependencies>
          <add dependency="CMS" />
          <add dependency="Shell"/>
           <add dependency="EPiServer.Cms.UI.Admin" type="RunAfter"/>
          <add dependency="EPiServer.Cms.UI.Settings" type="RunAfter"/> 
        </moduleDependencies>
        <requiredResources>
        </requiredResources>
      </clientModule>
    </module>
  1. 在启动文件中设置自动发现

services.Configure<ProtectedModuleOptions>(x => x.AutoDiscovery = EPiServer.Shell.Configuration.AutoDiscoveryLevel.Modules);

  1. 当我们然后启动项目时,它给出以下错误 错误屏幕截图

  2. 堆栈跟踪

  3. 当我们从启动类中删除自动发现设置时。它可以构建项目

有没有人经历过这个?请指出我正确的方向

4

1 回答 1

2

您无需将文件复制到示例项目中进行本地测试。您可以将项目引用添加到附加项目,然后将其添加到示例项目的启动中,以便正确加载文件:

var moduleName = typeof(SomeClassInYourAddOn).Assembly.GetName().Name;

services.Configure<CompositeFileProviderOptions>(options =>
{
    options.BasePathFileProviders.Add(new MappingPhysicalFileProvider(
        $"/EPiServer/{moduleName}",
        string.Empty,
        Path.GetFullPath($"..\\..\\src\\{moduleName}")));
});

services.Configure<ProtectedModuleOptions>(options =>
{
    options.Items.Add(new ModuleDetails { Name = moduleName });
});

不确定是否需要这样做,但我认为不会自动发现受保护的模块。因此,如果您的附加组件中有一个配置方法需要您的附加组件的消费者调用,那么您可以在方法中添加它:

var moduleName = typeof(SomeClassInYourAddOn).Assembly.GetName().Name;

services.Configure<ProtectedModuleOptions>(options =>
{
    if (!options.Items.Any(i => i.Name.Equals(moduleName, StringComparison.OrdinalIgnoreCase)))
    {
        options.Items.Add(new ModuleDetails() { Name = moduleName });
    }
});

然后即使未启用自动发现,也会添加您的附加组件。

于 2022-02-14T20:11:10.720 回答