如何在c#中做一个时间记录器类包装器

本文关键字:时间 一个 记录器 包装 | 更新日期: 2023-09-27 18:02:57

我有很多(大约一千个)FluentMigrator Migration类在我们的构建服务器上开始超时。

对于那些没有使用FluentMigrator的人来说,迁移的工作方式是这样的,所有的迁移都继承自Migration类,该类具有Up()Down()方法,可以运行SQL脚本进行db迁移-简单易行。

现在懒惰,我引入了一个LoggingMigration类,记录迁移开始运行的时间(并简单地将: Migration替换为该项目的VS中的: LoggingMigration)。

public class LoggingMigration : Migration
{
    public DateTime StartTime { get; private set; }
    public LoggingMigration()
    {
        this.StartTime = DateTime.Now;
        Console.WriteLine("Start {0} - TIME: {1:yyyy-MM-dd HH:mm:ss.fff}", this.GetType().Name, StartTime);
    }
    public override void Up()
    {
    }
    public override void Down()
    {
    }
}

我还想做一个迁移运行时间的时间,以便更容易地看到哪些迁移花费了很长时间。

我正在考虑使用析构函数:

    ~LoggingMigration()
    {
        Console.WriteLine("End(?) {0} - TIME: {1}", this.GetType().Name, DateTime.Now.Subtract(StartTime));
    }

但事情就是无常和不可预测

如何添加机制,将运行后Up()方法在子类完成?或者用其他方法来完成任务?

如何在c#中做一个时间记录器类包装器

如何重写一个受保护的方法,而不是公共的:

public abstract class Migration
{
    // ...
    protected DateTime StartTime { get; private set; }
    public Migration()
    {
        this.StartTime = DateTime.Now;
        Console.WriteLine("Start {0} - TIME: {1:yyyy-MM-dd HH:mm:ss.fff}", this.GetType().Name, StartTime);
    }
    public void Up()
    {
        OverrideUp();
        Console.WriteLine("End(?) {0} - TIME: {1}", this.GetType().Name, DateTime.Now.Substracts(StartTime));
    }
    public void Down()
    {
        // ...
        OverrideDown();
    }
    protected abstract void OverrideUp();
    protected abstract void OverrideDown();
}

为迁移类创建装饰器。它看起来就像:

public class LoggingMigrationDecorator : Migration {
        private Migration _migrationClass;
        public DateTime StartTime { get; private set; }
        public LoggingMigrationDecorator (Migration toDecorate)
                {
                     _migrationClass = toDecorate;
                    this.StartTime = DateTime.Now;
                    Console.WriteLine("Start {0} - TIME: {1:yyyy-MM-dd HH:mm:ss.fff}", this.GetType().Name, StartTime);
                }
                public override void Up()
                {
                 toDecorate.Up();
                 stopTimerFunction(); // your function that will stop timer and do something with result
                }

      public override void Down()
            {
            }
        }
    }

装饰模式示例:http://www.dofactory.com/net/decorator-design-pattern