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个应用程序已经在使用它,但现在将有一个不使用它。因此,现在我需要找到一种方法,继续在组件中使用它,但在该服务未实现时不要给出任何错误。