Blazor 无法为类型"我的组件"上的属性"范围工厂"提供值,因为该属性没有资源库



我正在用。net 6编写Blazor WASM应用程序。

应用程序的工作,因为它应该在Debug从Visual Studio 2022运行时,但当我部署它作为一个静态站点使用dotnet publish -c Release --nologo和访问bin/Release/net6.0/publish/wwwroot文件夹在localhost我得到以下错误:

Unhandled exception rendering component: Cannot provide a value for property 'ScopeFactory' on type 'MySolution.Pages.MyComponent' because the property has no setter.

我的组件是这样的:

public class MyComponent : OwningComponentBase
{
    public IOptions Option { get; set; } = Options.Default;
    protected override async Task OnInitializedAsync()
    {
        Options = await ScopedServices.GetRequiredService<Task<IOptions>>();
    }
}

我在Program.cs中添加了这样的服务

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<Task<IOptions>>(async op => await Options.Create(op.GetRequiredService<HttpClient>()));

Options.Create()看起来像这样

public static async Task<IGameOptions> Create(HttpClient client)
{
    var json = await client.GetStringAsync("/gameOptions.json");
    var options = JsonConvert.DeserializeObject<Options>(json);
    if (options is null)
    {
        throw new InvalidDataException("Given path contains invalid JSON object.");
    }
    return options;
}

我已经做了大量的测试和搜索,但我找不到任何东西。我试图只请求HttpClient服务在我的组件,但即使抛出相同的错误。

我看到这是DI中的一些问题,但我使用OwningComponentBase管理DI范围,正如ASP中所述。. NET Core Blazor依赖注入。

是什么引起的?

提前谢谢你

感谢您在评论中发布实际代码。看了之后,这看起来像是修剪的结果。

尝试添加<PublishTrimmed>false</PublishTrimmed>到您的项目文件,我认为它会工作。

基本上,当您运行命令dotnet publish -c Release --nologo时,它正在优化程序集的大小(修剪)。在您的情况下,它似乎正在更改OwningComponentBase中的以下代码:

[Inject] IServiceScopeFactory ScopeFactory { get; set; }

:

[Inject] IServiceScopeFactory ScopeFactory { get; }

。在修剪过程中去除setter

我认为这是实现

的一个bug

标记的答案只能在你不想在发布时修改应用程序的情况下使用,这并不总是可取的。如果您想发布带有微调的内容,则必须从微调中排除该类型。

<assembly fullname="Microsoft.AspNetCore.Components">
    <type fullname="Microsoft.AspNetCore.Components.OwningComponentBase" preserve="all" />
</assembly>

因为整个修剪的东西本身就是一个主题,我可以推荐这个页面作为调整修剪过程的开始:.Net博客-自定义修剪这篇博文是为。net 5写的,但我也在用。net 6。

我尝试了这篇文章中给出的两个答案,并希望分享我的发现,万一它们能帮助到别人。

Jesse Good的答案解决了这个问题,但给了我其他与性能相关的问题。它还使构建的时间长度增加了一倍。

Steffan Ossendorf的答案对我来说也很有效,尽管需要稍微多做一些修改和额外的文件,但绝对值得付出额外的努力。

如果它对任何人有帮助,这就是我在阅读了Steffan提到的关于修剪的文章后所做的。

我创建了一个新的XML文件" trim . XML "在我的Blazor项目的路线中,包含以下内容-

<linker>
    <assembly fullname="Microsoft.AspNetCore.Components">
        <type fullname="Microsoft.AspNetCore.Components.OwningComponentBase" preserve="all" />
    </assembly>
</linker>

然后我将它添加到我的Blazor项目的.csproj文件中-

<ItemGroup>
    <TrimmerRootDescriptor Include="Trimmer.xml" />
</ItemGroup>

相关内容

最新更新