Skip to content

托管 DotCraft Harness

DotCraft Harness 遵循标准的 .NET Generic Host 生命周期。应用负责构造 Host,在依赖准备完成后启动它,并在应用关闭时停止它。

构建 Host

在配置服务集合时注册 Harness。传入的 AppConfig 必须已经是这个 Host 最终应使用的配置。

csharp
using DotCraft.Configuration;
using DotCraft.Harness;
using Microsoft.Extensions.Hosting;

AppConfig appConfig = LoadApplicationConfig();

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddDotCraftHarness(appConfig, options =>
{
    options.WorkspacePath = Directory.GetCurrentDirectory();
});

using var host = builder.Build();

构建 Host 会验证组合并创建服务容器。Runtime 持有的 workspace 状态会在 Host 启动时初始化。

启动与停止

先启动 Host,再解析依赖已初始化 Runtime 的服务。应用资源释放前应先停止 Host。

csharp
await host.StartAsync(cancellationToken);

var sessions = host.Services.GetRequiredService<ISessionService>();
// 在 Host 运行期间使用会话服务。

await host.StopAsync(cancellationToken);

如果 Console 应用不需要自己的运行循环,可以用 RunAsync 管理完整的等待与关闭流程:

csharp
await host.RunAsync(cancellationToken);

CAUTION

不要在注册期间构建临时服务容器来解析 Harness 服务。请在最终 Host 构建完成后从 host.Services 解析服务。

集成桌面应用生命周期

WPF 和 WinUI 3 应用可以把 Host 作为应用状态持有。在应用启动流程中启动它,在退出流程中停止它。

csharp
public sealed class AgentHost : IDisposable
{
    private readonly IHost _host;

    public AgentHost(IHost host) => _host = host;

    public IServiceProvider Services => _host.Services;

    public Task StartAsync(CancellationToken ct = default) =>
        _host.StartAsync(ct);

    public Task StopAsync(CancellationToken ct = default) =>
        _host.StopAsync(ct);

    public void Dispose() => _host.Dispose();
}

请从 UI framework 提供的启动与退出 Hook 调用这些方法。

选择服务生命周期

服务所有权建议
IHost每个由应用持有的 Harness 实例使用一个。
WorkspaceRuntime由 Harness 注册,由 Host 持有。
ISessionService从运行中的 Host 解析,并在当前 workspace 内复用。
应用 UI 服务需要 Harness 依赖时,在同一服务集合中注册。

如果应用需要多套独立配置的 Runtime,请创建不同的 Host。每个实例都必须明确持有自己的 workspace 与数据路径。

处理启动失败

将 Host 启动视为应用初始化步骤。在开始接收用户任务前,应暴露路径无效、依赖缺失与配置错误。

csharp
try
{
    await host.StartAsync(cancellationToken);
}
catch (Exception ex)
{
    logger.LogCritical(ex, "DotCraft Harness failed to start.");
    throw;
}

相关文档