ABP - 在 Blazor 中使用 AbpCrudPageBase 时应用程序服务的依赖注入问题

ABP - Dependency injection issue for app service when using AbpCrudPageBase in Blazor

我一直在关注 this tutorial ABP 文档站点以学习 ABP(使用 Blazor Server 和 EF Core ABP 模板)。

我遇到的问题的代码可以在我的 Github 上找到(我已经为该问题创建了一个标签)。

我并没有完全一样,相反,我使用 Person 作为我的实体而不是 Book(制作一个体育俱乐部管理系统而不是书店)。

我完成了教程的第 1 部分并创建了正确的 API 端点,我能够使用它们执行 CRUD 操作。

我现在正在学习教程的第 2 部分,但“列表页面”未加载。

这是我在浏览器开发工具中看到的错误。

blazor.server.js?_v=637732634000000000:1 
        
       [2022-01-17T17:57:20.070Z] Error: System.InvalidOperationException: Cannot provide a value for property 'AppService' on type 'Acme.ClubManagement.Blazor.Pages.People'. There is no registered service of type 'Acme.ClubManagement.People.IPersonAppService'.
   at Microsoft.AspNetCore.Components.ComponentFactory.<>c__DisplayClass7_0.<CreateInitializer>g__Initialize|1(IServiceProvider serviceProvider, IComponent component)
   at Microsoft.AspNetCore.Components.ComponentFactory.PerformPropertyInjection(IServiceProvider serviceProvider, IComponent instance)
   at Microsoft.AspNetCore.Components.ComponentFactory.InstantiateComponent(IServiceProvider serviceProvider, Type componentType)
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.InstantiateChildComponentOnFrame(RenderTreeFrame& frame, Int32 parentComponentId)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& diffContext, Int32 frameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& diffContext, Int32 frameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& diffContext, Int32 newFrameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForFramesWithSameSequence(DiffContext& diffContext, Int32 oldFrameIndex, Int32 newFrameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& diffContext, Int32 oldStartIndex, Int32 oldEndIndexExcl, Int32 newStartIndex, Int32 newEndIndexExcl)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForFramesWithSameSequence(DiffContext& diffContext, Int32 oldFrameIndex, Int32 newFrameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& diffContext, Int32 oldStartIndex, Int32 oldEndIndexExcl, Int32 newStartIndex, Int32 newEndIndexExcl)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForFramesWithSameSequence(DiffContext& diffContext, Int32 oldFrameIndex, Int32 newFrameIndex)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& diffContext, Int32 oldStartIndex, Int32 oldEndIndexExcl, Int32 newStartIndex, Int32 newEndIndexExcl)
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer renderer, RenderBatchBuilder batchBuilder, Int32 componentId, ArrayRange`1 oldTree, ArrayRange`1 newTree)
   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()

我觉得难以理解的是,它说 Acme.ClubManagement.People.IPersonAppService 存在依赖注入问题,但在使用 API 端点时可以正确查找此服务。

为什么这个 DI 问题发生在 Blazor 页面上,而不是直接使用 API 端点时?

ABP 使用命名约定,参见 https://docs.abp.io/en/abp/latest/Dependency-Injection#exposed-services-by-convention

因此,如果将 IPersonAppService 重命名为 IPeopleAppService,问题将得到解决。

感谢提供最小的、可重现的示例

@TheMagnificent11 回复你在评论中写的问题;

问题是由People.razor中的以下代码块引起的。

<DataGridColumns>
       <DataGridColumn TItem="PersonDto"
                Field="@nameof(PersonDto.GivenName)"
                Caption="@Localizer["PeopleTable:GivenName"]">
       </DataGridColumn>
</DataGridColumns>
<DataGridColumns>
       <DataGridColumn TItem="PersonDto"
                Field="@nameof(PersonDto.Surname)"
                Caption="@Localizer["PeopleTable:Surname"]">
       </DataGridColumn>
</DataGridColumns>

有必要用以下代码替换此代码:

<DataGridColumns>
    <DataGridColumn TItem="PersonDto"
        Field="@nameof(PersonDto.GivenName)"
        Caption="@Localizer["PeopleTable:GivenName"]">
    </DataGridColumn>
    <DataGridColumn TItem="PersonDto"
        Field="@nameof(PersonDto.Surname)"
        Caption="@Localizer["PeopleTable:Surname"]">
    </DataGridColumn>
</DataGridColumns>

简而言之,问题是DataGridColumns标签在同一个DataGrid中使用了两次。

PS:@TheMagnificent11 我无法将答案放入评论字段,所以我不得不写在这里,仅供参考。