You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过扩展构造器优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18