如何在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()
方法在子类完成?或者用其他方法来完成任务?
如何重写一个受保护的方法,而不是公共的:
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