【问题标题】:How to get local data source in server side applications?如何在服务器端应用程序中获取本地数据源?
【发布时间】:2019-08-02 13:19:44
【问题描述】:

我正在使用 blazor 服务器端应用程序。在那我需要参考本地数据源。

我已将 Http 用作默认客户端示例。

@code{

    ChartData[] dataSource;
    protected override async Task OnInitAsync()
    {
        dataSource = await Http.GetJsonAsync<ChartData[]>("scripts/aapl.json");
    }
}

但我一直面临如下问题,

谁能指导我解决这个问题?

【问题讨论】:

    标签: c# blazor blazor-server-side


    【解决方案1】:

    托管模式

    在托管模式下,您是否需要一个休息端点(或其他类型的传输模式)来访问数据并调用后端操作:

        USER                     BACKEND 
        SIDE
    
              HTTP
              or other network
              transport.
                 |
                 |
    
    client ---- dto ---> rest api ----> server functions
    (wasm)
                 |
                 |
    
    

    服务器端模式

    在服务器端模式下,您不需要通过rest api访问服务器数据,您的应用程序在服务器上执行,只需注入服务并直接调用服务器功能,而不是通过网络传输。

        USER                     BACKEND 
        SIDE
    
    
                       SignalR
                      (websocket)
                          |
                          |
    
    client <--- virtual dom changes ---> .razor pages ----> server functions
    (html                 
     +css                 |
     +js)                 |
                          |
                          |
    
    

    奖金

    要轻松地从托管模型切换到服务器端,您可以为两者(server functionsrest client transport class)创建一个 IServiceInterface,并使用依赖注入在每个场景中使用一个或其他实现。简化:

                       hosted model 
    
                                       |
             - rest client trans class----> web api ----
            |  (IServiceInterface)     |                |
    Client -                           |                |--> server functions
            |                          |                |  (IServiceInterface)
             ------------------------------------------
                                       |
    
                       server side model
    
    

    【讨论】:

    【解决方案2】:

    与客户端 Blazor 不同,服务器端 Blazor 要求您将 HttpClient 添加到 DI 容器中,并将其注入到您的组件中。

    你可以这样做:

    • 将此代码添加到您的 Startup.ConfigureServices 方法中:
        // Server Side Blazor doesn't register HttpClient by default
        if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
        {
            // Setup HttpClient for server side in a client side compatible fashion
            services.AddScoped<HttpClient>(s =>
            {
                var uriHelper = s.GetRequiredService<IUriHelper>();
                return new HttpClient
                {
                    BaseAddress = new Uri(uriHelper.GetBaseUri())
                };
            });
        }
    
    • 也可以使用IHttpClientFactory来配置和创建HttpClient实例(最好)

    回答你的问题

    如何在服务器端应用中获取本地数据源:

    定义一个可以直接访问数据库的本地服务可以解决问题。请参阅默认的服务器端模板如何做到这一点。您可以在服务中使用 Entity Framework Core 来访问数据库对象。

    请注意,如果您决定切换到 Blazor 客户端,则使用直接访问数据库的本地服务可能会产生不利影响,因为在客户端 Blazor 上执行的数据访问服务与您的服务器之间的通信是不可能的。这是规划如何实施 Blazor 应用的重要性的示例。就个人而言,我会坚持使用 HttpClient,并避免服务,但这是我个人的看法。其他人可能会不这么认为。

    希望这会有所帮助...

    【讨论】:

      【解决方案3】:

      这将有助于从服务器端应用程序读取 json 文件,

      @using Newtonsoft.Json
      
      ....
      @code{
      protected override async Task OnInitAsync()
          {
      
              {
                  dataSource = JsonConvert.DeserializeObject<ChartData[]>(System.IO.File.ReadAllText("./wwwroot/chartdata.json"));
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        相关资源
        最近更新 更多