如何在服务器端应用程序中获取本地数据源?
How to get local data source in server side applications?
我正在使用 Blazor 服务器端应用程序。因为我需要参考本地数据源。
我使用了 Http as like 默认客户端示例。
@code{
ChartData[] dataSource;
protected override async Task OnInitAsync()
{
dataSource = await Http.GetJsonAsync<ChartData[]>("scripts/aapl.json");
}
}
但我一直面临如下问题,
谁能指导我解决这个问题?
与 client-side Blazor 不同,server-side 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 实例(最好)
回答您的问题
How to get local data source in server side applications:
定义一个可以直接访问数据库的本地服务可以解决问题。查看默认的 server-side 模板如何做到这一点。您可以在服务中使用 Entity Framework 核心来访问数据库对象。
请注意,如果您决定切换到 Blazor client-side,使用直接访问数据库的本地服务可能会产生不利影响,因为在 client-side Blazor 上执行的数据访问服务与您的服务器是不可能的。这是规划如何实施 Blazor 应用的重要性的示例。就个人而言,我会坚持使用 HttpClient 并避免使用服务,但这是我个人的看法。其他人可能不这么认为。
希望这对您有所帮助...
托管模式
在托管模式下,您是否需要休息端点(或其他类型的传输模式)来访问数据和调用后端操作:
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 functions
和 rest client transport class
)创建一个 IServiceInterface
,并使用依赖注入在每个模型上使用一个或其他实现设想。简体:
hosted model
|
- rest client trans class----> web api ----
| (IServiceInterface) | |
Client - | |--> server functions
| | | (IServiceInterface)
------------------------------------------
|
server side model
这将有助于从服务器端应用程序读取 json 文件,
@using Newtonsoft.Json
....
@code{
protected override async Task OnInitAsync()
{
{
dataSource = JsonConvert.DeserializeObject<ChartData[]>(System.IO.File.ReadAllText("./wwwroot/chartdata.json"));
}
}
}
我正在使用 Blazor 服务器端应用程序。因为我需要参考本地数据源。
我使用了 Http as like 默认客户端示例。
@code{
ChartData[] dataSource;
protected override async Task OnInitAsync()
{
dataSource = await Http.GetJsonAsync<ChartData[]>("scripts/aapl.json");
}
}
但我一直面临如下问题,
谁能指导我解决这个问题?
与 client-side Blazor 不同,server-side 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 实例(最好)
回答您的问题
How to get local data source in server side applications:
定义一个可以直接访问数据库的本地服务可以解决问题。查看默认的 server-side 模板如何做到这一点。您可以在服务中使用 Entity Framework 核心来访问数据库对象。
请注意,如果您决定切换到 Blazor client-side,使用直接访问数据库的本地服务可能会产生不利影响,因为在 client-side Blazor 上执行的数据访问服务与您的服务器是不可能的。这是规划如何实施 Blazor 应用的重要性的示例。就个人而言,我会坚持使用 HttpClient 并避免使用服务,但这是我个人的看法。其他人可能不这么认为。
希望这对您有所帮助...
托管模式
在托管模式下,您是否需要休息端点(或其他类型的传输模式)来访问数据和调用后端操作:
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 functions
和 rest client transport class
)创建一个 IServiceInterface
,并使用依赖注入在每个模型上使用一个或其他实现设想。简体:
hosted model
|
- rest client trans class----> web api ----
| (IServiceInterface) | |
Client - | |--> server functions
| | | (IServiceInterface)
------------------------------------------
|
server side model
这将有助于从服务器端应用程序读取 json 文件,
@using Newtonsoft.Json
....
@code{
protected override async Task OnInitAsync()
{
{
dataSource = JsonConvert.DeserializeObject<ChartData[]>(System.IO.File.ReadAllText("./wwwroot/chartdata.json"));
}
}
}