Blazor中调用注入Enigma类Encrypt方法报错的解决求助
解决Blazor中依赖注入对象无法在字段初始化器调用方法的问题
错误原因
你遇到的错误A field initializer cannot reference the non-static field, method, or property 'Home.enigma',本质是Blazor依赖注入的执行顺序导致的:注入的Enigma实例是在组件对象创建完成后才被赋值的,而字段初始化代码(char letter = enigma.Encrypt('H');)是在组件实例化过程中执行的,此时enigma还未完成注入,处于未赋值状态,因此无法调用其方法。
解决方案
方案1:使用组件生命周期方法初始化字段
将初始化逻辑移到Blazor组件的生命周期方法中,比如OnInitialized(同步场景)或OnInitializedAsync(异步场景),此时依赖注入已经完成,enigma实例可用:
@page "/" @using BlazorEngimaWeb.EnigmaModel @inject Enigma enigma <PageTitle>Engima</PageTitle> <h1>Hello, world!</h1> <p>加密结果:@letter</p> Welcome to your new app. @code{ char letter; protected override void OnInitialized() { letter = enigma.Encrypt('H'); } }
方案2:直接在UI渲染时调用方法(无需字段)
如果只是需要展示加密结果,可以直接在页面的UI部分调用enigma.Encrypt方法,Blazor会在组件渲染时(此时注入已完成)执行该方法:
@page "/" @using BlazorEngimaWeb.EnigmaModel @inject Enigma enigma <PageTitle>Engima</PageTitle> <h1>Hello, world!</h1> <p>加密'H'的结果:@enigma.Encrypt('H')</p> Welcome to your new app.
额外注意:确保Enigma服务已注册
在使用依赖注入前,需要在Program.cs中将Enigma类注册到DI容器中,推荐注册为Scoped生命周期(适配Blazor组件的场景):
builder.Services.AddScoped<Enigma>();
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

