本文介绍Blazor Web应用Auto交互呈现模式的实现方案,如下示例是基于 Known 框架来实现的,该解决方案共有3个项目,具体实现步骤如下:

1. 前后端共用项目

  • 创建前后端共用类库项目Sample,定义系统的实体类、数据模型、服务接口、常量、枚举等,项目工程文件内容如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
  • 在该项目中添加示例服务接口,继承框架IService
//IService为框架定义的Api服务接口,用于标识该接口为前后端交互接口
//程序启动时,框架自动查找Assembly中的接口,根据接口定义WebApi路由
//该示例路由为:/Test/GetMessage
public interface ITestService : IService {
Task<string> GetMessageAsync();
}

2. 客户端项目

  • 创建客户端项目Sample.Client,引用WebAssembly所需依赖,引用Castle依赖动态代理Http请求后端WebApi,项目工程文件内容如下:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="8.0.6" />
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageReference Include="Castle.Core" Version="5.1.1" />
<PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
<ProjectReference Include="..\Sample\Sample.csproj" />
</ItemGroup>
</Project>
  • 添加拦截器HttpClientInterceptor.cs类文件,继承Castle.DynamicProxy.IAsyncInterceptor,实现Http动态代理
using Castle.DynamicProxy;

namespace Sample.Client;

// HttpInterceptor为框架封装的拦截器
public class HttpClientInterceptor<T>(IServiceScopeFactory provider) : HttpInterceptor<T>(provider), IAsyncInterceptor where T : class {
protected override async Task<HttpClient> CreateClientAsync() {
var type = typeof(T);
var factory = await ServiceFactory.CreateAsync<IHttpClientFactory>();
var client = factory.CreateClient(type.Name);
client.BaseAddress = new Uri(Config.HostUrl);
return client;
} public void InterceptAsynchronous(IInvocation invocation) {
invocation.ReturnValue = SendAsync(invocation.Method, invocation.Arguments);
} public void InterceptAsynchronous<TResult>(IInvocation invocation) {
invocation.ReturnValue = SendAsync<TResult>(invocation.Method, invocation.Arguments);
} public void InterceptSynchronous(IInvocation invocation) { }
}
  • Program.cs文件中添加客户端配置
//使用Castle代理生成器创建Http代理类型
private static readonly ProxyGenerator Generator = new(); services.AddHttpClient();
//添加KnownClient,注入拦截器提供者
services.AddKnownClient(info =>
{
info.InterceptorType = type => typeof(HttpClientInterceptor<>).MakeGenericType(type);
info.InterceptorProvider = (type, interceptor) =>
{
return Generator.CreateInterfaceProxyWithoutTarget(type, ((IAsyncInterceptor)interceptor).ToInterceptor());
};
});
  • 添加测试页面组件Test.razor
@page "/test"

<h1>@message</h1>

@code {
//注入服务与Server模式注入没有区别
[Inject] private ITestService Service { get; set; }
private string message; protected override async Task OnAfterRenderAsync(bool firstRender) {
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
message = await Service.GetMessageAsync();
//这里的Service实例,会根据渲染模式自动切换
//SSR时,就是后端实现ITestService的实现类的实例
//CSR时,就是Castle代理生成器创建的代理类的实例
}
}

3. 服务端项目

  • 创建服务端项目Sample.Web,项目工程文件内容如下:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.6" />
<ProjectReference Include="..\Sample.Client\Sample.Client.csproj" />
</ItemGroup>
</Project>
  • 修改App.razor文件中的呈现模式
<Routes @rendermode="InteractiveMode" />

@code {
private InteractiveAutoRenderMode InteractiveMode => new(false);
}
  • 添加TestService.cs实现服务接口
class  TestService : ITestService {
public Task<string> GetMessageAsync() => Task.FromResult("test");
}
  • Program.cs文件中添加服务端配置
//添加Known框架后端Core
services.AddKnownCore();
//添加Known框架自动生成WebApi
services.AddKnownWebApi();
//注入服务接口
services.AddScoped<ITestService, TestService>(); //使用Known框架静态文件和WebApi
app.UseKnown();

4. 结语

本文示例代码仅作Auto模式实现方案的参考,具体功能实现,可查看 Known 框架的实例源码。

Blazor Web 应用如何实现Auto模式的更多相关文章

  1. Java Web的两种开发模式

    参考文献:http://www.cnblogs.com/xdp-gacl/p/3908610.html 一.Jsp+JavaBean 此模式如下图所示:

  2. Web的Ajax应用开发模式(二)——Ajax开发模式分析

    寄语: 前天在查看一些公司的招聘要求时,看到有公司要求测试人员了解Ajax,故写此博文旨在帮助测试人员提高自身技术知识水平,愿与广大测试同胞共同进步.(欢迎纠错!!!) Web应用的传统开发模式总结: ...

  3. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  4. 如何使用 Azure Active Directory 认证和 Microsoft Graph 构建 Blazor Web 应用

    如何使用 Azure Active Directory 认证和 Microsoft Graph 构建 Blazor Web 应用 英文原文:https://developer.microsoft.co ...

  5. 高访问量WEB开发中的架构模式,学习从点滴开始

     当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构 ...

  6. Java开发web的几种开发模式

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...

  7. Web的Ajax应用开发模式(三)——Ajax的开发

    Ajax是XMLHttpRequest对象和JavaScript.CSS.HTML.DOM等多种技术的结合. 此处重点强调XMLHttpRequest的以下特点,所以测试人员在测试到WEB的Ajax应 ...

  8. 在Web中实现C/S模式的Tab

    在探讨C/S模式的Tab之前,我们先总结一下B/S模式的Tab通常是什么样的.web中常见的tab设计通常是用于分节展示大量信息以提高页面空间的利用率,而且这些信息通常是静态的,或者交互比较简单.通过 ...

  9. 对web应用中单一入口模式的理解及php实现

    在我们web应用的开发中,经常会听见或看见单一入口模式,在我开始学习tp框架的时候也不理解为什么要运用一个单一入口模式,只是会使用,最近自己在搞一个小东西的时候才明白为什么在web开发中要运用单一入口 ...

  10. 【Web开发】Mean web开发 01-Express实现MVC模式开发

    简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...

随机推荐

  1. 认识mongodb

    Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自 ...

  2. P7322

    P7322 好神仙! \(\color{#5bc9}\text{提醒,本文有大量没有推到过程的式子,所以读者可以自己遮住先推一下}\) Inscription: 有一个长度为 \(k\) 的窗口,在一 ...

  3. 如何基于R包做GO分析?实现秒出图

    GO分析 基因本体论(Gene Ontology, GO)是一个用于描述基因和基因产品属性的标准术语体系.它提供了一个有组织的方式来表示基因在生物体内的各种角色.基因本体论通常从三个层面对基因进行描述 ...

  4. 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码

    支付宝签名和验签使用JSONObject是最优解.json字符串顺序和==符号都一致演示代码 支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.c ...

  5. Windows CSC提权漏洞复现(CVE-2024-26229)

    漏洞信息 Windows CSC服务特权提升漏洞. 当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的内存区域.这种溢出会损坏内存,并可能使攻击者能够 ...

  6. 深入理解Android View(1)

    做android其实也有一段时间了,我们每个人都会碰到一些这样或那样的问题,碰到问题了就拼命百度,可是发现,我们解决问题的能力并没有提升很多,所以我才有想总结一下我项目中所用过的相关知识,并了解一下A ...

  7. UICollectionView滑动流畅性优化

    UICollectionView滑动流畅性优化 前言 初始的collection view在滑动时都是十分流畅的,然而因为collection view cell 加载更多的内容时因为主线程耗用太多性 ...

  8. 使用iperf3调试网络

    介绍 Iperf是一款基于TCP/IP和UDP/IP的网络性能测试工具,它可以用来测量网络带宽和网络质量,还可以提供网络延迟抖动.数据包丢失率.最大传输单元等统计信息.网络管理员可以根据这些信息了解并 ...

  9. lumen、laravel 环境问题汇总

    框架报500 1.chmod 777 -R storage 将日志目录权限设置下. 2.修改fastcgi,将代码目录包含进去. fastcgi_param PHP_ADMIN_VALUE " ...

  10. python跟踪脚本运行过程(类似bash shell -x)

    #详细追踪 python -m trace --trace pyscript.py #显示调用了哪些函数 python -m trace --trackcalls pyscript.py