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 我无法将答案放入评论字段,所以我不得不写在这里,仅供参考。
我一直在关注 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 我无法将答案放入评论字段,所以我不得不写在这里,仅供参考。