欢迎光临 @azure-net/ kit (英语)
文档
第6版整合
配置 AzureNetPlugin() 从 @azure-net/kit/plugin 和维特的斯维尔特基特一起,
然后导出 { register } 从 createApp(...) 内 src/program.ts。 。 。 .
打电话 register() root布局初始化时同步. useClient 可能
同步:同步安装了导航订阅,以及
中间软件在 an await 仅从此开始适用。 处理
如果客户端初始化失败, 返回的保证 。 客户端中间软件本身
必须保持同步.
插件只提供虚拟钩. 它不创建或重写页面/显示
模块。 手动 hooks.server, (中文(简体) ), hooks.client 财务报告和审定财务报表 hooks 文件被禁止.
初始请求状态通过斯韦尔特可水分一次被水分;后期导航为客户端所拥有.
program.ts 通用: 仅输入静态服务器并不安全
因为它在内部使用 useServer。使用明确的构建时浏览器守护
并保留SvelteKit的构建检查.
应用结构
src/app/
Contexts/{Orders,Identity,SharedKernel}/
Domain/{Entities,Ports,Enums}
Infrastructure/Repositories
Application/UseCases
Presentation/{Admin,Public,Shared}/
Ui/
Scopes/
Shell/
Platform/
Foundation/{Datasource,Response,Schema,DI}
Bootstrap/{Routes,Localization}
没有工作空间, Ui, (中文(简体) ), Scopes 财务报告和审定财务报表 Shell 直接坐在楼下 Presentation。 。 。 .
中央移民局住在这里 Platform/Foundation/DI/ApplicationProvider.ts. 背景可能
导入 SharedKernel但互不相见 演示范围可以构成任何
环境。 工作空间可能导入 Shared但互不相见.
* 边界提供者按安保部门改革请求缓存其代理、登记和服务,
并非全球范围。 浏览器实例会缓存到清理为止 。 工厂和 boot
是同步的. await cleanupProvider(name) 明确处置即时
服务并重置缓存;请求补全不会自动引用.
单独安装 CLI npm i -D @azure-net/cli。它的交火工具命令
配置 Pretier 不安装承诺包 . azure-net commit 承诺
分阶段修改; azure-net push 检查,阶段,承诺和推. --no-check
跳过检查。 审查 .gitignore 开始之前.
类导师 助动器
导入 createAsyncResource 财务报告和审定财务报表 createAsyncAction 直接从
@azure-net/kit/delivery。帮助者执行一次行动并提供支持 beforeSend, (中文(简体) ),
onSuccess, (中文(简体) ), onError 财务报告和审定财务报表 fallbackResponse4. 额外资源 reject。 。 。 .
Schema 失败由本地转换为 error.validation。没有全球
错误解析器, useAzureNetKitError,或帮助级重试。 被丢弃的例外
onSuccess 或者说 onError 宣传没有改变,没有重放动作.
import { RegisterProvider, createAsyncResource } from '@azure-net/kit/delivery';
import { ApplicationProvider } from '#platform/Foundation/DI';
import type { OrdersUseCases } from '#contexts/Orders/Application/UseCases/OrdersUseCases';
export class OrdersPresenter {
constructor(private readonly useCases: OrdersUseCases) {}
collection() {
return createAsyncResource(() => this.useCases.collection());
}
}
export const useOrdersPresenter = RegisterProvider(
() => {
const { Orders } = ApplicationProvider();
return new OrdersPresenter(Orders);
},
{ lifecycle: 'scoped', bindMethods: true };
});
打电话 useOrdersPresenter() 在组件初始化时,而不是在模块范围.
登记本身在模块范围是安全的,不能解决依赖性问题.
RegisterProvider 返回实际的类实例,没有代理。 可选
第二个参数是一个选项对象: { lifecycle?: ..., bindMethods?: ... }。 。 。 .
默认为 lifecycle: 'scoped' 财务报告和审定财务报表 bindMethods: false。旧的字符串参数
不再支持。 由于装订已禁用,方法和财产描述符
一直没动过.
使用 bindMethods: true 以绑定函数值数据属性,包括继承
方法,或 bindMethods: ['collection'] 以选择打入的方法名称。 绑定运行
只有在工厂返回后,每个新建实例一次。 访问者是
从未评估或替换,包括Svelte rune访问器。 建筑师和
原型方法被排除在外。 选定的访问器( 甚至有一个返回 a)
函数),缺少方法,或者保护属性抛出而不是默默地失败.
TypeScript 无法区分函数返回获取器与方法,所以
访问器检查也发生在运行时 .
方法引用在绑定后是稳定的. 无法冻结/ 无法扩展的情况
接受继承的约束方法。 任意代理和异地内置物体
不支持约束性目标。 函数值字段也与 true· ;
如果实例中包含组件构造器或其他可调用设备,则使用明确的列表
依赖性。 没有全局缓存保留实例或约束函数 。 约束没有
追溯适用于在建造过程中捕获的回调或后来被替换的方法.
使用 Svelte 运算符的类 $state 必须在 .svelte.ts 模块
(或Svelte组件内申报),非常规 .ts 文档.
| 生命周期 | 服务器 | 浏览器 |
|---|---|---|
scoped (默认) | 每项请求每次登记一次 | 每个呼叫的新实例 |
transient | 每个呼叫的新实例 | 每个呼叫的新实例 |
singleton | 每项请求每次登记一次 | 每次登记一次 |
服务器缓存要求 AzureNetPlugin 请求上下文并失败
在外边。 没有全过程服务器单通. 请求缓存有弱点
键,不保留已完成的请求。 登记不需要姓名,
斯维尔特语上下文,水合,或状态序列化. 工厂召回必须
同步; 递归性构造被拒绝 .
此 API 不拥有效果、 订阅、 定时器或 dispose()保留
在组件寿命实例中组件自有效果; 缓存浏览器单通
不得依赖要求它的第一个组件所拥有的效果。 安全部门改革
孤立不会将状态序列化到浏览器,也不能保护可变
模块级状态被用户工厂捕获.
@azure-net/ kit (英语) 是一个通用的工具包和图书馆藏书,作为《公约》的一部分 阿苏雷网 生态系统。 其设计旨在加快现代应用开发,减少锅炉板码,并维持统一的工程架构.
这是什么?
@azure-net/ kit (英语) 不仅仅是收集公用事业或部件。 这是完整的 结构 (Azure-net architecture) 基于 DDD (域- 驱动设计) 原则,帮助您建立结构清晰的可扩展和可维护的项目.
包括什么内容?
- 反应状态类 请求同位化服务器实例和浏览器单通
RegisterProvider。 。 。 . - 本地化和翻译:内置的基于 rune 的i18n 有请求范围 SSR 实例. 没有边缘或外部翻译依赖性.
- 大型公用事业 用于文本、对象、日期和共同任务.
- 数据验证 ——方便规则和验证人.
- 可重复使用的基础抽象 —— 说
Repositories, (中文(简体) ),Services, (中文(简体) ),Providers,以及Datasources用于快速设置和再利用. - 统一的架构办法 ——这套方案提供了坚实的项目结构,有助于实施一致的发展标准.
为什么用它?
通过使用 @azure-net/ kit (英语),您可以得到一个现成的项目框架:
- 减少锅炉板代码,
- 加速发展,
- 简化测试,
- 支持一个明确和可预测的架构.
这对中大规模应用的团队工作特别有用.
{\fn华文楷体\fs16\1cHE0E0E0}学习更多
在这个指南中,你会发现:
- 分步设置和配置指令.
- 建筑图案的详细解释.
- 使用内置商店和翻译的例子.
- 组织守则的建议
Repositories, (中文(简体) ),Services,以及Datasources。 。 。 .
开始吧
准备潜入吗? 看看这个 文档 并开始构建你的应用 更快和更可靠 阿苏雷网。 。 。 .
初始状态和 useBoot
AzureNetPlugin() 拥有一个工具包-本地Async LocalStorage范围. 这不取决于
边缘,串行存储,注入响应脚本或创建虚拟路由模块.
本版本中没有边缘商店/介绍出口或devtools出口.
RequestContext.current() 仅曝光 event 财务报告和审定财务报表 state中,只有服务器,而且
在活动请求外抛出。 内部的DI/ERROR/生命周期缓存是私人的.
可转让状态 src/app.d.ts (优先选择CSR的可选字段):
import type { IUser } from '#contexts/Identity/Domain';
declare global {
namespace App {
interface RequestContextState {
currentUser?: IUser | null;
}
}
}
export {};
import { createApp, ServerMiddlewareManager } from '@azure-net/kit';
import { RequestContext } from '@azure-net/kit/server-context';
export const { register } = createApp((app) => {
app.useServer(async ({ event, resolve }) => {
await new ServerMiddlewareManager([ServerAuth]).execute();
return resolve(event);
});
app.useBoot(({ state }) => {
useCurrentUser().setUser(state.currentUser ?? null);
})
);
配置回调同步. 每个 app.useX(...) 返回时 void· ;
包含单独语句的注册钩,不连锁或 return app。 。 。 .
重复的注册和注册在召回完成后进行.
虎克处决仍然遵循框架生命周期,而不是登记令.
支持Aync工作的钩子保留着现有的Aync合同.
在根布局调用中 register() 在解决演讲者或州级课程之前.
useBoot 同步运行,每服务器请求渲染一次,每次运行一次
浏览器应用程序初始化,在客户端生命周期回调之前. 等待所有服务器
国家准备前 resolve。不要在
翻译。 客户端导航和重复寄存器调用不会使状态回水.
useClientInit 运行得更早,不能依赖这个快照。 无公司社会责任
接收 SSR 快照 {}; 初始化默认并明确获取缺失数据.
仅发布安全的 DTO, 不发布任何符号或整个请求/ 本地文件 。 个性化 HTML
不得公开缓存。 类,功能和服务不序列化.
Svelte 目前需要 Aync 模式用于 hydratable数字 :
sveltekit({ compilerOptions: { experimental: { async: true } } });
保持应用程序的 CSP 配置正确; Svelte 管理传输 剧本与连载. 工具包不使用自定义 HTML 解析器 .
DI 名称
createBoundaryProvider 改为: CreateServiceContainer (无相容性别名):
const ApplicationProvider = CreateServiceContainer('ApplicationProvider', {
register: () => ({ Users: () => new UsersUseCases(repository) })
});
const { Users } = ApplicationProvider();
进入器仍然懒惰、同步和按请求范围对安保部门改革进行审查. RegisterProvider
单个级工厂的注册; singleton 表示一个浏览器实例, 但是
服务器上每个请求一个实例,从来不是一个服务器进程单子.
内建i18n:见: 页:1登记a new TranslationManager(options) 结束 app.useTranslations(manager). 服务器准备,地语水合和客户端词典加载在相应的用户钩之前自动运行. 不需要单独的翻译包或人工生命周期电话.
同步 SSR 水分
仅限客户端的信号保持同步. 用稳定的非空密钥选择 SSR :
<script lang="ts">
import { createAsyncSignal } from '@azure-net/kit';
const result = await createAsyncSignal(() => loadProfile(), {
server: true,
key: 'profile:current-user'
});
</script>
<p>{result.response?.name}</p>
<button onclick={() => result.refresh()}>Refresh</button>
在组件初始化时使用启用的 Svelte 实验 Async 调用 .
斯维尔特的 hydratable 将初始序列结果转移给浏览器,
用于不重复请求的重用; 之后的刷新会正常执行.
没有模块全局服务器请求状态 。 处理者必须同时工作
环境。 密钥必须匹配整个SSF/水分,并区分请求输入.
beforeSend 只运行实际请求; 成功/错误回调和 ready
解决办法适用于双方。 请求错误会生成错误状态信号 .
immediate: false 保持信号闲置并禁用初始水分. 批次
工厂保持同步,明确拒绝 server: true 检查类型和
运行时间; 使用单个等待的服务器信号 .
见 同步细节 寿命周期, 序列化,出错,取消,CSP,和批发行为.
SvelteKit 3 钩子和阶级中端软件
错误回调使用本地受到歧视 CaughtError 合同来源
@sveltejs/kit/hooks。 。 。 . status 财务报告和审定财务报表 message 上层不再添加.
对于 kind: 'app', (中文(简体) ), 'framework' 或者说 'validation'读取 error.status 财务报告和审定财务报表
error.message用于 kind: 'unknown', (中文(简体) ), error 遗 物 unknown: 缩小它之前
登录,而不将其潜在的私人信息还给客户。 验证
问题只存在于 'validation' 树枝。 返回时 { status, message }
以覆盖公共响应,或者不返回任何保留 SvelteKit 默认值.
被除名者 handleValidationError 钩子没有生成 .
import { RemoteLogger } from '@azure-net/kit';
app.useServerError(({ kind, error }) => {
if (kind === 'unknown') {
RemoteLogger.log(error, {});
return { status: 500, message: 'Internal Error' };
}
return error;
});
中间软件阵列现在包含 构造器,而不是函数或已有实例. 构造者必须接受任何必要的参数。 新建实例 只有在每次请求/导航时,才进行。 解决依赖关系 在该实例中,不输入模块级特定请求变量.
import {
ServerMiddlewareManager,
ClientMiddlewareManager,
type IServerMiddleware,
type ServerMiddlewareContext,
type IClientMiddleware,
type ClientMiddlewareContext
} from '@azure-net/kit';
import { beforeNavigate } from '$app/navigation';
class ServerAuth implements IServerMiddleware {
async execute({ event, next }: ServerMiddlewareContext) {
if (!event.cookies.get('session')) return next('/login', 303);
next();
}
}
class ClientGuard implements IClientMiddleware {
execute({ next, to, navigation }: ClientMiddlewareContext): undefined {
if (navigation?.shallow) return next();
if (to.pathname === '/private') return next('/login', { replace: true });
return next();
}
}
const serverMiddlewares = new ServerMiddlewareManager([ServerAuth]);
const clientMiddlewares = new ClientMiddlewareManager([ClientGuard]);
app
.useServer(async ({ event, resolve }) => {
await serverMiddlewares.execute();
return resolve(event);
})
.useClient(() => {
beforeNavigate((navigation) => clientMiddlewares.execute(navigation));
});
// Run the same checks without navigating or registering another subscription.
clientMiddlewares.execute();
管理员快取构造器列表并保留不请求数据或中间软件例,这样可以在模块范围中声明. ServerMiddlewareManager.execute() 每次解决当前请求. ClientMiddlewareManager.execute() 使用当前页面 URL; from 财务报告和审定财务报表 navigation 在手动运行中未定义。 客户端执行是SSY期间的禁用.
createApp 不再注射 useMiddlewares 或订阅导航本身。 登记册 beforeNavigate 内部同步 useClient,在任何时间之前 await。手动运行不会创建取消的导航:省略 next() 只是停止运行。 避免从它执行的中间软件中调用管理器,包括通过HTTP恢复间接调用. 重运行一个完整的链条也会重运行分析;如果只必须同步认证状态,则使用更小的管理器.
IMiddleware<Context, Result> 是共同接口。 客户端 execute 严格
同步( e)undefined 返回, 通常为 return next(); 服务器 execute 能够
返回时 void 或者说 Promise<void>. 弃权 next() 封锁链条。 也没有
链条或容器自动处理中件所拥有的订阅 :
保持中间软件的短寿命,不要将长寿命的听众附在那里.
客户端 next(location, options) 财务报告和审定财务报表 useRedirect(...).clientRedirectSettings
使用 SvelteKit 软件 GotoOptions 直接 : replace, (中文(简体) ), reset, (中文(简体) ), refreshAll, (中文(简体) ), shallow, (中文(简体) ),
persistState, (中文(简体) ), state 财务报告和审定财务报表 invalidate。客户端导航数据包括本地
navigation 活动。 在 Kit 3 中,浅切换也会触发导航钩; 选择
明确警卫是否应该跳过它们. goto 用于应用路径, 而非外部
URL;外部导航应当使用浏览器位置API.
组成
CreateServiceContainer 保持不变. CompositionRoot 是个懒阶级
外表上,有一个独特的符号 作为其内部容器的身份。 它可以在模块中创建
范围; resolve() 解析当前 SSR 请求或浏览器
缓存, 从未被构建者捕获过的请求 .
import { CompositionRoot } from '@azure-net/kit';
export const Http = new CompositionRoot({
register: () => ({ Api: () => new ApiDatasource() })
});
export const Identity = new CompositionRoot({
dependsOn: { Http },
register: ({ Http }) => ({
Account: () => new AccountUseCases(new AccountRepository(Http.Api))
})
});
// Inside a presenter factory or an active request:
const { Account } = Identity.resolve();
依附者接受其他两个 CompositionRoot 实例和现有
CreateServiceContainer 进入者。 服务类型通过链子推断.
只有注册元数据包; 服务周围没有额外的代理
没有新的缓存层。 重复解决保留了现有的集装箱/服务
身份证明 如果需要明确清理,请使用 await cleanupProvider(Identity.name)。 。 。 .
一次宣出根来, 而不是创造新的根 每一个成分成.
name 现在是一个符号,而不是一个可序列的字符串。 它的描述用于诊断
只; 等同描述永远不会共享缓存 。 直接通过的现有字符串密钥
改为 CreateServiceContainer 财务报告和审定财务报表 cleanupProvider 继续支持.
HTTP 检索
属于 HttpServiceInstance,包括直接通过使用
案例。 没有 retry 选项,不重复失败的请求. limit 计数
其他尝试: limit: 1 表示最多两次HTTP尝试.
// A separate session client: no authentication recovery hooks.
const sessionHttp = new HttpServiceInstance({ prefixUrl: apiUrl });
const http = new HttpServiceInstance({
prefixUrl: apiUrl,
onRequest(request) {
const token = readAccessToken();
if (token) request.headers.set('Authorization', `Bearer ${token}`);
},
retry: {
limit: 1,
statuses: [401],
async shouldRetry({ error }) {
if (!isExpiredAccessToken(error.data)) return false;
const refreshed = await sessionHttp.post('/api/auth/refresh', {
json: { refreshToken: readRefreshToken() }
});
saveTokens(refreshed.data);
return true;
}
}
});
上面的托肯帮助是应用程序定义的 。 在当前范围内读取/写入符号 请求 SSR 时,从未处于共享模块级用户状态。 坐标并行 每个会话/请求酌情刷新; 通用 HTTP 客户端不刷新 执行符号旋转或交叉协调.
{ limit: N }重试任何失败的 HTTP 尝试, 包括网络失败 .statuses将重试限制在这些错误状态下;[]不允许.shouldRetry只在状态过滤后运行,而且预算还在. 同步和同步布尔均被接受.- 按请求
retry替换整个默认策略。 使用{ limit: 0 }改为 关掉它。 没有重试策略的单独会话客户端不会继承 应用程序客户端的重试或钩子. onRequest在每次尝试之前运行,如此刷新的证书会被再次读取.onResponse成功一次运行;onError运行一次终端 HTTP 失败, 不包括成功恢复的中间故障.- 钩子的例外(包括:
shouldRetry宣传不再进一步 复原。 他们没有被视为另一次运输失败. - 取消的请求和流出的请求机构永远不会被重放. 取消 还停止等待恢复;召回必须管理取消 拥有基本的工作.
limit必须是有限的非负式安全整数。 没有隐含的重试 延迟/后退。 每次HTTP尝试都分别应用超时.
复选是所有HTTP方法的选入. 网络后不要盲目重试
错误: 服务器可能已经应用过 。 使用狭义状态/ 代码策略
或后端支持的一能键。 数字 retry: 3 不再支持;
写入 retry: { limit: 3 } 换句话说.
HTTP 钩子使用这些签名 :
retry: {
limit: 1,
shouldRetry: async ({ error }) => {
// Delegate refresh to your session service with a separate HTTP client.
return false;
}
},
onError: ({ error, request }) => {
// Terminal failure notification / validation mapping. No http is exposed.
}
这是从位置改变的突破 onError(error, request, http)。 。 。 .
请求级的钩子覆盖使用相同的签名. 嵌入请求使用实例
设置加上他们自己的选项,而不是外部请求的身体或信号.
停止信号停止等待起钩以及运输业务。 任意
用户承诺不能强制终止:钩子必须合作停止
自身副作用. 虎克没有隐含的超时;提供并中止一个信号给
把他们的等待时间绑住 超时处理包括运输和身体
解析,包括自定义 doFetch与 responseFormat: 'body'时结束
读取/取消该流是呼叫者的工作.
计时员/听众在成功,失败,超时和取消时被删除.
JSON 序列化错误现在拒绝在发送之前而不是默发
虚空的身体。 默认 JSON 序列器不支持循环值或
BigInt; 提供 stringifyJson 如果需要自定义线条格式.
删除 http 从 onError 无法防止通过被捕获的客户端重现
在关闭。 不从错误处理器启动同样的失败操作 .
也没有 shouldRetry 也没有 onError 曝光HTTP客户端. 使用单独的
会话客户端没有恢复钩子用于刷新/登录 。 适用于 HTTP 的限制
调用,而不是任意嵌入式用户代码.