docs/archives/117-import-export-architecture-refactor/implementation.md
原架构问题:
新架构设计:
// 统一接口定义
export interface IImportExportable {
exportData(): Promise<any>;
importData(data: any): Promise<void>;
getDataType(): Promise<string>;
validateData(data: any): Promise<boolean>;
}
// DataManager只负责协调
class DataManager {
async exportAllData(): Promise<string> {
const services = [modelManager, templateManager, historyManager, preferenceService];
const data = {};
for (const service of services) {
const dataType = await service.getDataType();
data[dataType] = await service.exportData();
}
return JSON.stringify({ version: 1, exportTime: new Date().toISOString(), data });
}
}
问题识别:
解决方案:
// PreferenceService内部处理前缀转换
class PreferenceService {
private readonly PREFIX = 'pref:';
async exportData(): Promise<any> {
const allData = await this.getAll();
const exportData = {};
// 移除前缀,使用逻辑键名导出
for (const [key, value] of Object.entries(allData)) {
const logicalKey = key.startsWith(this.PREFIX) ? key.slice(this.PREFIX.length) : key;
exportData[logicalKey] = value;
}
return exportData;
}
}
所有接口方法都设计为异步,支持:
export class ImportExportError extends Error {
constructor(
message: string,
public readonly dataType?: string,
public readonly originalError?: Error
) {
super(message);
this.name = 'ImportExportError';
}
}
现象: 用户导出JSON只有4个设置项,应该有8个
诊断过程:
解决方案:
现象: 编译错误,模块间循环引用
解决方案:
现象: Vue reactive对象无法通过IPC传输
解决方案:
// 在proxy类中进行序列化
async exportData(): Promise<any> {
const result = await window.electronAPI.modelManager.exportData();
return JSON.parse(JSON.stringify(result)); // 深度序列化
}
# 1. 检查导出数据
console.log(await dataManager.exportAllData());
# 2. 检查PreferenceService数据
console.log(await preferenceService.getAll());
# 3. 检查存储层数据
console.log(await storageProvider.getAll());
# 4. 对比逻辑键名和物理键名
// 验证所有服务都实现了接口
const services = [modelManager, templateManager, historyManager, preferenceService];
for (const service of services) {
console.assert(typeof service.exportData === 'function');
console.assert(typeof service.importData === 'function');
console.assert(typeof service.getDataType === 'function');
console.assert(typeof service.validateData === 'function');
}
每个服务的import-export.test.ts文件包含:
data/import-export-integration.test.ts验证:
使用Playwright自动化测试:
创建storage-key-consistency测试套件:
DataManager (375行)
├── 协调各服务
├── 实现具体导入导出逻辑
├── 处理数据格式转换
└── 错误处理和验证
DataManager (67行) - 只负责协调
├── ModelManager.exportData()
├── TemplateManager.exportData()
├── HistoryManager.exportData()
└── PreferenceService.exportData()
IImportExportable接口
├── 统一的方法签名
├── 异步操作支持
└── 错误处理规范
只需实现IImportExportable接口:
class NewService implements IImportExportable {
async exportData(): Promise<any> { /* 实现 */ }
async importData(data: any): Promise<void> { /* 实现 */ }
async getDataType(): Promise<string> { return 'newServiceData'; }
async validateData(data: any): Promise<boolean> { /* 实现 */ }
}