C# 如果blazor中存在服务,如何在blazor中注入服务?

C# 如果blazor中存在服务,如何在blazor中注入服务?,c#,asp.net-core,blazor,C#,Asp.net Core,Blazor,如果我使用Inject属性并尝试注入未注册的服务,它会给出错误没有类型为X的注册服务 那么,我如何才能在不给我这个错误的情况下注入一个服务呢?如果没有注入该服务,该服务将是空的。这可能吗 e、 g 如果未注册Foo,这将给我一个错误 [Inject] protected Foo Foo { get; set; } 但是我想允许Foo未注册,在这种情况下,它将是null您可以这样做 @inject IServiceProvider ServiceProvider @code { priva

如果我使用
Inject
属性并尝试注入未注册的服务,它会给出错误
没有类型为X的注册服务

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

e、 g

如果未注册
Foo
,这将给我一个错误

[Inject]
protected Foo Foo { get; set; }
但是我想允许
Foo
未注册,在这种情况下,它将是
null

您可以这样做

@inject IServiceProvider ServiceProvider

@code
{
  private IMyService MyService;

  protected override void OnInitialized()
  {
    MyService = ServiceProvider.GetService<IMyService>();
    base.OnInitialized();
  }
}
@InjectIServiceProvider服务提供者
@代码
{
私有IMyService MyService;
受保护的覆盖无效OnInitialized()
{
MyService=ServiceProvider.GetService();
base.OnInitialized();
}
}

如果您想访问服务器端数据,但仅当blazor在服务器端预渲染(blazor WebAssembly App(ASP.Net Core托管))时,此问题才有意义

在这种情况下,您可能正在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;
        }
    }
}

当然,这闻起来像个XY问题。详细说明为什么(您认为)您需要它,您可能会得到更好的选择。@HenkHolterman这不是XY问题,我可以解释为什么需要它,但我想知道,您是否可以想出一个需要可选服务的案例?在应用程序级别:不,我不允许这样。在一个库中,这可能有点道理,但我会尽力避免这种情况。@HenkHolterman你几乎说对了。它不是一个库,而是我公司使用blazor的许多应用程序的共享内核。我正在我的组件中注入一个“全局加载”服务,这样它就可以监视应用程序任何加载状态的变化,并在需要时设置自己的加载。但我没有想到的是,并非所有应用程序都会有这种“全局加载”。2个应用程序已经在使用它,但现在将有一个不使用它。因此,现在我需要找到一种方法,继续在组件中使用它,但在该服务未实现时不要给出任何错误。