2016-08-17 36 views
0

我有很多(大約一千)FluentMigratorMigration類在我們的構建服務器上開始超時。如何在C#中執行時間記錄器類包裝器

對於那些誰也不會FluentMigrator工作 - 遷移以這樣的方式工作,所有的遷移從有對數據庫遷移運行SQL腳本Up()Down()方法Migration類繼承 - 簡單和容易。

現在懶惰我已經引入了一個LoggingMigration類,它記錄了遷移開始運行的時間(並且簡單地將該項目的VS中的: Migration替換爲: 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)); 
    } 

但事情僅僅是volatile and unpredictable

如何添加,將在後子類飾面Up()方法運行機制? 或者其他一些可以完成這項工作的方式?

回答

1

如何覆蓋一個受保護的方法,而不是公共之一:

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(); 
} 
+0

嗨馬特,我不能修改移民類它來自FluentMigrator但我可以介紹是從遷移繼承類(如LoggingMigrator)。您建議在所有當前遷移中用'OverrideUp()'替換'Up()'是否正確? –

+0

@MatasVaitkevicius沒錯。無論是或者你可以使用自定義屬性,但我會堅持面向對象的方式。 –

-1

創建遷移類的裝飾。 它看起來像:Decorator模式

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