【问题标题】:How can I inject a service in blazor only if it exists?仅当服务存在时,如何在 blazor 中注入服务?
【发布时间】:2020-06-09 19:51:04
【问题描述】:

如果我使用Inject 属性并尝试注入未注册的服务,它会给我错误There is no registered service of type X

那么我怎样才能在不给我这个错误的情况下注入服务,如果没有注入服务,服务将只是空的。这可能吗?

例如

如果Foo 没有注册,这会给我一个错误。

[Inject]
protected Foo Foo { get; set; }

但我想允许 Foo 未注册,在这种情况下它将是 null

【问题讨论】:

  • 这当然像是一个 XY 问题。扩展为什么(你认为)你需要它,你可能会得到更好的选择。
  • @HenkHolterman 这不是 XY 问题,我可以解释为什么我需要这个,但我想知道,你能想出一个需要可选服务的情况吗?
  • 在应用程序级别:不,我不允许这样做。在图书馆里这可能是有道理的,但我会非常努力地避免这种情况。
  • @HenkHolterman 你几乎是对的。它不是库,而是我公司中许多使用 blazor 的应用程序的共享内核。而且我在我的组件中注入了一个“全局加载”服务,这样它就可以观察应用程序任何加载状态的变化,并在需要时设置它自己的加载。但我没有想到的是,并不是所有的应用程序都会有这种“全局加载”。 2 个应用程序已经在使用它,但现在会有一个不会使用它。所以现在我需要找到一种方法来继续在组件中使用它,但在没有实现该服务时不要给出任何错误。

标签: c# asp.net-core blazor


【解决方案1】:

你可以这样做

@inject IServiceProvider ServiceProvider

@code
{
  private IMyService MyService;

  protected override void OnInitialized()
  {
    MyService = ServiceProvider.GetService<IMyService>();
    base.OnInitialized();
  }
}

【讨论】:

    【解决方案2】:

    如果您想访问服务器端数据,但前提是 blazor 在服务器端预呈现(Blazor WebAssembly App (ASP.Net Core Hosted)),这个问题可能有意义。

    在这种情况下,您可能会在 ASP.Net 应用 Startup.cs 和 Blazor WebAssembly 入口点 Program.cs 中注册服务。

    在这种情况下,您可以为要访问的功能创建一个界面:

    namespace BlazorApp1.Client {
        public interface IResponse {
            void SetNotFound();
        }
    }
    

    拥有一个不执行任何操作或返回空结果的接口实例,可以为 Program.cs 注册:

    namespace BlazorApp1.Client {
        public class ResponseStub : IResponse {
            public void SetNotFound() {
                // Do nothing if we are browser side
            }
        }
    }
    

    还有另一个与 Setup.cs 中的实例设置一起工作的实例:

    using BlazorApp1.Client;
    using Microsoft.AspNetCore.Http;
    using System.Net;
    
    namespace BlazorApp1.Server {
        public class Response : IResponse {
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public Response(IHttpContextAccessor accessor) {
                _httpContextAccessor = accessor;
            }
    
            public void SetNotFound() {
                _httpContextAccessor.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-29
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多