如果我使用Inject
属性并尝试注入未注册的服务,则会出现错误没有已注册类型为X的服务
。
那么如何在不出现此错误的情况下注入服务,如果未注入服务,则该服务将为空。这可能吗?
例如:
如果Foo
没有注册,这将给我一个错误。
[Inject]
protected Foo Foo { get; set; }
但我希望允许 Foo
未注册的情况,此时它将成为 null
。
如果我使用Inject
属性并尝试注入未注册的服务,则会出现错误没有已注册类型为X的服务
。
那么如何在不出现此错误的情况下注入服务,如果未注入服务,则该服务将为空。这可能吗?
例如:
如果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();
}
}
如果您想要访问服务器端数据,那么这个问题可能是有意义的,但前提是 Blazor 在服务器端进行预渲染(Blazor WebAssembly 应用程序(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;
}
}
}