eskv.client 1.4.3
dotnet add package eskv.client --version 1.4.3
NuGet\Install-Package eskv.client -Version 1.4.3
<PackageReference Include="eskv.client" Version="1.4.3" />
paket add eskv.client --version 1.4.3
#r "nuget: eskv.client, 1.4.3"
// Install eskv.client as a Cake Addin #addin nuget:?package=eskv.client&version=1.4.3 // Install eskv.client as a Cake Tool #tool nuget:?package=eskv.client&version=1.4.3
eskv.client
eskv.client 是 eskv 的客户端库
入门
使用 IDE 或以下命令将其添加到您的项目中
dotnet add package eskv.client
在 F# 脚本中,您可以使用 #r 指令引用它
#r "nuget: eskv.client"
对于测试版,请在 cli 上使用 --prerelease
标志或指定版本
#r "nuget: eskv.client, Version=*-beta*"
使用以下行在 eskv.fsx 脚本文件中保存您的第一个值
#r "nuget: eskv.client"
open eskv
let client = EskvClient()
client.Save("Hello","World")
将 eskv 服务器运行时执行它,并使用 dotnet fsi eskv.fsx
在 F# 交互中使用,浏览器打开到 https://127.0.0.1:5000。您应该在新 Hello
键所在的默认容器中看到一个值为 World
的新键。
版权和许可证
代码版权所有 Jérémie Chassaing。 eskv 和 eskv.client 均在 学术公共许可证 下发布。
API
此文档仅呈现同步操作。所有方法都有一个带有异步后缀的异步版本,并返回一个 Task
或 Task
。
构造函数
let client = EskvClient()
使用默认 https://127.0.0.1:5000
网址实例化新的 EskvClient。
EskvClient(uri: Uri)
使用指定的网址实例化新的 EskVClient。
键值存储
键值存储可以在指定键下保存值。 键按 容器 组合。如果没有指定容器,则使用 默认
。
键值存储支持版本控制使用的 ETags。
保存
Save(key: string, value: string) : unit
在指定键下保存值。如果键不存在,则创建键。如果已存在,则更新值。不进行版本控制。
Save(container: string,key: string, value: string) : unit
在给定的容器中保存指定键下的值。如果键不存在,则创建键。如果已存在,则更新值。不进行版本控制。
尝试保存
TrySave(key: string, value: string, etag: string) : string
使用版本控制保存指定键下的值。如果键不存在,在 etag
参数中传递 null
以创建它。
如果键已存在,传递从 Load
或之前的 TrySave
调用中获得的当前 ETag 值以更新值。
如果 ETag 匹配,则使用指定的值创建或更新键,并返回新的 ETag。否则方法返回 null
。
TrySave(container: string,key: string, value: string, etag: string)
使用版本控制,在给定的容器中保存指定键下的值。如果键不存在,在 etag
参数中传递 null
以创建它。
如果键已存在,传递从 Load
或之前的 TrySave
调用中获得的当前 ETag 值以更新值。
如果 ETag 匹配,则使用指定的值创建或更新键,并返回新的 ETag。否则方法返回 null
。
尝试加载
TryLoad(key: string) : LoadResult
尝试从指定键加载值。
如果键存在,LoadResult
的 KeyExists
属性为 true,Value
包含键值,且 Etag
是当前键的 ETag。
如果键不存在,LoadResult
的 KeyExists
属性为 false,Value
和 Etag
为 null
。此 null
ETag 可以在 TrySave
调用中使用,表示键不存在。
TryLoad(container: string, key: string) : LoadResult
尝试从指定键在给定的容器中加载值。
LoadResult
与没有容器的重载类似。
删除键
DeleteKey(key: string) : unit
如果键存在,则删除键,否则无操作。
DeleteKey(container: string, key: string) : unit
如果指定容器中的键存在,则从指定容器中删除键,否则无操作。
获取键
GetKeys() : string[]
返回 默认
容器中的所有键。
如果容器不存在,则抛出异常。
GetKeys(container: string) : string[]
返回指定容器中的所有键。
如果容器不存在,则抛出异常。
获取容器
GetContainers() : string[]
返回所有容器的名称。如果没有容器存在,则为空。
删除容器
DeleteContainer(container: string) : unit
如果存在,则删除指定的容器,否则无操作。
事件存储
追加
Append(stream: string, events: EventData seq) : unit
将事件追加到指定流的末尾。
EventData
结构包含一个字符串属性 EventType
和一个字符串属性 Data
。
尝试追加
TryAppend(stream: string, expectedVersion: int events: EventData seq) : AppendResult
尝试将事件追加到指定流的末尾。如果流的当前版本等于指定的 expectedVersion
,则操作成功。
EventData
结构包含一个字符串属性 EventType
和一个字符串属性 Data
。
当流尚不存在时,将 ExpectedVersion.NoStream
作为 expectedVersion
参数提供。
当操作成功时,AppendResult
的 Success
属性等于 true
。ExpectedVersion
属性指示流的当前版本。它可以传递给 TryAppend
,以追加新事件到流中。NextEventNumber
属性指示用于读取刚刚追加的事件之后的事件的下一个事件号。
按顺序读取流
ReadStreamForward(stream: string, start: int) : Slice
从指定事件号开始读取指定流的全部事件。对于 start
使用 0,以读取从起始点开始的所有事件。
返回一个 Slice
结构
State
:如果流不存在,则为NoStream
,否则为StreamExists
。Events
:包含读取事件的EventRecord
数组。EndOfStream
:指示是否已达到流的末尾。ExpectedVersion
:最后读取的事件号。可以传递给TryAppend
,以在流的末尾追加新事件。NextEventNumber
:可以用来加载剩余流的下一个事件号。
EventRecord
结构具有以下属性
EventNumber
:流中事件的编号EventType
:事件的类型Data
:事件数据OriginalEventNumber
:在投影(例如,对于$streams
)的情况下,原始流中事件的编号,否则等于EventNumber
。- 'OriginalStream':投影(例如,从
$streams
)的情况下的原始流名称,否则等于提供的流名称。
ReadStreamForward(stream: string, start: int, count: int) : Slice
从指定流中从指定事件编号开始读取最多 count
个事件。使用 0 作为 start
来从开始读取事件。
返回的 Slice
与前面的重载类似。
使用切片中的 NextEventNumber
作为下一次调用 ReadStreamForward
的 start
参数,以获取下一个切片。
ReadStreamForward(stream: string, start: int, count: int, linkOnly: bool) : Slice
从指定流中从指定事件编号开始读取最多 count
个事件。使用 0 作为 start
来从开始读取事件。
返回的 Slice
与前面的重载类似。
当 linkOnly
为 true,并且流是投影(例如,stream
)时,EventRecord
的 Data
属性为 null。
ReadStreamForward(stream: string, start: int, count: int, linkOnly: bool, startExcluded: bool) : Slice
从指定流中从指定事件编号开始读取最多 count
个事件。使用 0 作为 start
来从开始读取事件。
返回的 Slice
与前面的重载类似。
当 startExcluded
为 true 时,返回的第一个事件是 start
之后的事件。当维护预期的版本并读取后续事件时,可以使用此功能。
ReadStreamSince
ReadStreamSince(stream: string, start: int)
相当于 ReadStreamForward
ReadStreamSince(stream: string, start: int, count: int)
相当于 ReadStreamForward
ReadStreamSince(stream: string, start: int, count: int, linkOnly: bool)
相当于 ReadStreamForward
GetStreamAsync
GetStreamAsync(stream: string, start: int, count: int, linkOnly: bool, startExcluded: bool) : Task<ReadResult>
此方法仅存在于异步版本中,因为它返回一个包含 IAsyncEnumerable<EventRecord>
的 ReadResult
。
参数与 ReadStreamForward
类似。
返回的 ReadResult
具有以下属性
State
:如果流不存在,则为NoStream
,否则为StreamExists
。Events
:一个包含已读取事件的IAsyncEnumerable<EventRecord>
。ExpectedVersion
:最后读取的事件号。可以传递给TryAppend
,以在流的末尾追加新事件。NextEventNumber
:可以用来加载剩余流的下一个事件号。
TryAppendOrRead
TryAppendOrRead(stream: string, expectedVersion: int events: EventData seq) : AppendOrReadResult
参数类似于 TryAppend
。当 expectedVersion
与当前流版本不匹配时,符合 expectedVersion
的事件将在 AppendOrReadResult
结构的 NewEvents
属性中返回。在这种情况下,ExpectedVersion
和 NextEventVersion
属性与最后一个返回的事件相关。
GetStreams
GetStreams(start: int, count: int) : StreamSlice
从 start
开始获取 count
个流名称。
StreamSlice
结构具有以下属性
State
:如果还没有流存在,则为NoStream
,否则为StreamExists
。Streams
:包含流名称的数组。LastEventNumber
:最后返回的流创建事件的编号。NextEventNumber
:下一个流创建事件的编号。
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
-
net6.0
- FSharp.Core (>= 6.0.6)
- HttpMultipartParser (>= 7.0.0)
- Microsoft.Extensions.Primitives (>= 6.0.0)
NuGet 包
该包未被任何 NuGet 包使用。
GitHub 仓库
该包未被任何流行的 GitHub 仓库使用。
版本 | 下载 | 最后更新 |
---|---|---|
1.4.3 | 402 | 11/4/2022 |
1.3.2 | 361 | 11/4/2022 |
1.2.3 | 412 | 10/23/2022 |
1.0.28 | 384 | 6/17/2022 |
1.0.26-gcde74f07e4 | 141 | 6/17/2022 |
1.0.25-g018253e238 | 120 | 6/17/2022 |
1.0.24-beta-gf65e83c8a0 | 147 | 3/25/2022 |
1.0.20-beta-g4b509857e4 | 152 | 3/11/2022 |
1.0.19-beta-g972fb2c79b | 136 | 3/11/2022 |
1.0.17-beta-g572da9798f | 144 | 3/11/2022 |
1.0.15-beta-g163c9028c7 | 158 | 2/3/2022 |
1.0.13-beta-g300b52be39 | 150 | 2/3/2022 |
1.0.11-beta-g88318336f9 | 150 | 10/15/2021 |
1.0.10-beta-g58a4e6456c | 156 | 10/15/2021 |
1.0.9-beta-g23f345ab88 | 186 | 10/15/2021 |
1.0.8-beta-gc770c0f83b | 192 | 10/15/2021 |
1.0.6-beta-ge21effba94 | 170 | 10/14/2021 |
1.0.4-beta-g576a5818e8 | 163 | 10/13/2021 |
1.0.2-beta-g7de10401cb | 189 | 10/13/2021 |