如何通过扩展构造器优化C#遗留DBLogger类?
解决方案:通过继承+参数封装类扩展DBLogger功能
1. 定义参数封装类
先创建一个参数封装类,把原构造器的所有必填参数和新增的自定义状态字段整合进去,避免构造器参数过多的问题:
public class DBLoggerOptions { public ITraceabilityDatabase Database { get; set; } public Exception FileImportError { get; set; } public string Vendor { get; set; } public string FileName { get; set; } public long FileSize { get; set; } public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } // 新增的自定义状态字段,用于传入DUPLICATE状态 public string CustomStatus { get; set; } }
2. 继承原DBLogger类并实现扩展
创建子类继承原DBLogger,添加私有字段存储自定义状态,编写接收封装类的构造器复用基类逻辑,同时重写日志方法实现自定义状态的判断:
public class ExtendedDBLogger : DBLogger { private readonly string _customStatus; // 接收参数封装类的构造器,调用基类构造器填充原有字段 public ExtendedDBLogger(DBLoggerOptions options) : base(options.Database, options.FileImportError, options.Vendor, options.FileName, options.FileSize, options.StartTime, options.EndTime) { _customStatus = options.CustomStatus; } // 隐藏基类的Log方法,实现包含自定义状态的日志逻辑 public new void LogFileImportStatus() { string errorMessage = GetErrorMessage(); // 优先使用自定义状态,无自定义状态时沿用原逻辑 string importStatus = string.IsNullOrEmpty(_customStatus) ? GetOriginalImportStatus() : _customStatus; if (!_database.InsertFileInfo(FileName, Vendor, FileSize, StartTime, EndTime, importStatus, errorMessage)) { EventLogWriter.WriteEntry($"Failed to add file entry in database for {FileName}{Environment.NewLine}Error: {_database.GetLastError()}"); } } // 复制原类的GetImportStatus逻辑(原方法为private,子类无法直接调用) private string GetOriginalImportStatus() { if (FileImportError != null) { if (FileImportError is PartialImportException) { return "PARTIAL"; } return "FAILURE"; } return "SUCCESS"; } // 复制原类的GetErrorMessage逻辑 private string GetErrorMessage() { return FileImportError?.Message ?? string.Empty; } }
3. 实际使用示例
通过参数封装类实例化扩展后的Logger,传入DUPLICATE状态:
var loggerOptions = new DBLoggerOptions { Database = yourDatabaseInstance, FileName = "imported_file.csv", Vendor = "ABC_Vendor", FileSize = 2048, StartTime = DateTime.Now.AddMinutes(-5), EndTime = DateTime.Now, CustomStatus = "DUPLICATE" // 传入新增的状态 }; var logger = new ExtendedDBLogger(loggerOptions); logger.LogFileImportStatus();
关键说明
- 由于原类的核心状态判断方法为私有且非虚,子类无法直接重写,因此通过复制原逻辑+新增自定义状态分支的方式实现扩展,完全不修改原类代码。
- 参数封装类的设计让构造器参数更简洁,后续新增参数只需修改封装类,无需调整构造器签名,符合开闭原则。
内容的提问来源于stack exchange,提问作者user16405900
相关产品推荐
相关产品推荐

