【问题标题】:How to pass a parameter to a Blazor service?如何将参数传递给 Blazor 服务?
【发布时间】:2022-08-19 22:24:29
【问题描述】:

我有一个像下面这样的示例代码的服务:

using System.Collections.Generic;
using System.Threading.Tasks;
namespace BasicDependencyInjection
{
  public interface IToDoApi
  {
    Task<IEnumerable<ToDo>> GetToDosAsync();
  }
  public class ToDoApi : IToDoApi
  {
    private readonly IEnumerable<ToDo> Data;
    public ToDoApi()
    {
      Data = new ToDo[]
      {
        new ToDo { Id = 1, Title = \"To do 1\", Completed = true},
        new ToDo { Id = 2, Title = \"To do 2\", Completed = false},
        new ToDo { Id = 3, Title = \"To do 3\", Completed = false},
      };
    }
    public Task<IEnumerable<ToDo>> GetToDosAsync() => Task.FromResult(Data);
  }
}

这不是我的代码,只是一个示例代码a tutorial page

这是服务的注册方式。

service.AddSingeton<IToDoApi, ToDoApi>();

我的问题是,我需要将值传递给服务,即ToDoApi() 方法。

如何才能做到这一点?例如,如何将令牌传递给服务而不在代码中硬编码。

还有一件事,我不能将参数传递给 register 方法,我想在我的组件中使用服务时传递一个参数,因为提供服务的令牌来自组件。

谢谢

  • 在接口和服务中添加一个接受参数的方法,然后在组件中注入接口并调用该方法
  • \"因为提供服务的令牌来自组件\" 您打算根据用户对 UI 中各种组件的操作来使用不同的 API 访问令牌?您不是通过以某种方式将用户访问令牌绑定到您的身份验证系统来管理用户访问令牌吗?你用的是认证系统吗?
  • 嗨,@keithwill-the-upvoter 让我澄清一下,我基本上是在获取 Github API,但我有两个组件,例如 /users/user-profiles,它们需要获取特定的 URL,例如 /api/users。这意味着,与其复制获取 URL 所需的代码,我更愿意创建一个服务并在需要时共享它。问题是服务本身需要接受一个参数(到 github 的 URL)......虽然 URL 不是静态的,但 URL 中有一个 ID 会发生变化(但这很容易,我可以从我当前的浏览器 url 获取 ID ) 例如,http://localhost/users/323 - 希望这会有所帮助
  • ID 是否以任何方式与您的 Web 应用程序的经过身份验证的用户相关联?
  • @keithwill-the-upvoter 不,这里没有什么需要身份验证的。 ID 是从 URL 中获取的,但我需要将 ID 传递给服务,以便我可以从服务内部进行经过身份验证的获取。只有服务内的代码会进行身份验证 .. 但它首先需要该 ID

标签: blazor blazor-server-side


【解决方案1】:

你需要做这样的事情:

public class ToDo
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;
    public bool Completed { get; set; }
}

public interface IToDoApi
{
    Task<IEnumerable<ToDo>> GetToDosAsync();
}

public class ToDoApi : IToDoApi
{
    private readonly IEnumerable<ToDo> Data;

    private bool initialized;
    
    public ToDoApi()
    {
        Data = new ToDo[]
        {
        new ToDo { Id = 1, Title = "To do 1", Completed = true},
        new ToDo { Id = 2, Title = "To do 2", Completed = false},
        new ToDo { Id = 3, Title = "To do 3", Completed = false},
        };
    }
    public void Initialize(bool initialize)
    {
        initialized = initialize;
    }

    public Task<IEnumerable<ToDo>> GetToDosAsync()
    {
        if (!initialized)
            throw new Exception("You must initialize ToDoAPI before trying to use it");
        
        return Task.FromResult(Data);
    } 
}

你从你的组件中调用Initialize 来获取数据并传递你想要的任何数据。我通过传入实际的布尔值使其变得简单。

【讨论】:

  • 谢谢,您能否添加一个有关如何实例化并实际传递参数的示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-09-11
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2022-01-05
相关资源
最近更新 更多