-
Notifications
You must be signed in to change notification settings - Fork 41
Expand file tree
/
Copy pathCliAdapterFactory.cs
More file actions
150 lines (130 loc) · 4.12 KB
/
CliAdapterFactory.cs
File metadata and controls
150 lines (130 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using Microsoft.Extensions.DependencyInjection;
using WebCodeCli.Domain.Common.Extensions;
using WebCodeCli.Domain.Domain.Model;
namespace WebCodeCli.Domain.Domain.Service.Adapters;
/// <summary>
/// CLI工具适配器工厂接口
/// </summary>
public interface ICliAdapterFactory
{
/// <summary>
/// 根据工具配置获取对应的适配器
/// </summary>
/// <param name="tool">CLI工具配置</param>
/// <returns>对应的适配器实例,如果没有匹配的适配器则返回null</returns>
ICliToolAdapter? GetAdapter(CliToolConfig tool);
/// <summary>
/// 根据工具ID获取对应的适配器
/// </summary>
/// <param name="toolId">工具ID</param>
/// <returns>对应的适配器实例,如果没有匹配的适配器则返回null</returns>
ICliToolAdapter? GetAdapter(string toolId);
/// <summary>
/// 检查指定工具是否有对应的适配器(支持流式解析)
/// </summary>
/// <param name="tool">CLI工具配置</param>
/// <returns>是否支持流式解析</returns>
bool SupportsStreamParsing(CliToolConfig tool);
/// <summary>
/// 获取所有已注册的适配器
/// </summary>
/// <returns>适配器列表</returns>
IEnumerable<ICliToolAdapter> GetAllAdapters();
}
/// <summary>
/// CLI工具适配器工厂实现
/// 负责管理和分发不同CLI工具的适配器
/// </summary>
[ServiceDescription(typeof(ICliAdapterFactory), ServiceLifetime.Singleton)]
public class CliAdapterFactory : ICliAdapterFactory
{
private readonly List<ICliToolAdapter> _adapters;
public CliAdapterFactory()
{
// 注册所有内置适配器
_adapters = new List<ICliToolAdapter>
{
new CodexAdapter(),
new ClaudeCodeAdapter(),
new OpenCodeAdapter(),
// 未来可以在这里添加更多适配器
// new QwenCodeAdapter(),
// new GeminiAdapter(),
};
}
/// <summary>
/// 允许通过依赖注入注册自定义适配器
/// </summary>
public CliAdapterFactory(IEnumerable<ICliToolAdapter> adapters)
{
_adapters = adapters.ToList();
// 确保至少有默认适配器
if (!_adapters.Any(a => a is CodexAdapter))
{
_adapters.Insert(0, new CodexAdapter());
}
if (!_adapters.Any(a => a is ClaudeCodeAdapter))
{
_adapters.Insert(1, new ClaudeCodeAdapter());
}
if (!_adapters.Any(a => a is OpenCodeAdapter))
{
_adapters.Insert(2, new OpenCodeAdapter());
}
}
public ICliToolAdapter? GetAdapter(CliToolConfig tool)
{
if (tool == null)
return null;
foreach (var adapter in _adapters)
{
if (adapter.CanHandle(tool))
{
return adapter;
}
}
return null;
}
public ICliToolAdapter? GetAdapter(string toolId)
{
if (string.IsNullOrEmpty(toolId))
return null;
foreach (var adapter in _adapters)
{
if (adapter.SupportedToolIds.Any(id =>
string.Equals(id, toolId, StringComparison.OrdinalIgnoreCase)))
{
return adapter;
}
}
return null;
}
public bool SupportsStreamParsing(CliToolConfig tool)
{
var adapter = GetAdapter(tool);
return adapter?.SupportsStreamParsing ?? false;
}
public IEnumerable<ICliToolAdapter> GetAllAdapters()
{
return _adapters.AsReadOnly();
}
/// <summary>
/// 注册新的适配器(用于运行时动态添加)
/// </summary>
/// <param name="adapter">适配器实例</param>
public void RegisterAdapter(ICliToolAdapter adapter)
{
if (adapter != null && !_adapters.Contains(adapter))
{
_adapters.Add(adapter);
}
}
/// <summary>
/// 移除指定的适配器
/// </summary>
/// <param name="adapter">适配器实例</param>
public void UnregisterAdapter(ICliToolAdapter adapter)
{
_adapters.Remove(adapter);
}
}