2016-08-17 7 views
0

FluentMigratorMigration 개의 빌드 서버에서 시간이 초과 된 클래스가 많이 있습니다 (천 개 정도). 마이그레이션이 같은 방법으로 작업하는 모든 마이그레이션이 DB 마이그레이션을위한 SQL 스크립트를 실행 Up()Down() 방법이 Migration 클래스에서 상속 - - 간단하고 쉬운 FluentMigrator 함께 일하지 않은 사람들을 위해C에서 시간 기록기 클래스 래퍼를 수행하는 방법

.

지금 마이그레이션 실행을 시작할 때 나는 시간을 로깅하는 LoggingMigration 클래스를 도입 게으름 (그리고 단순히 프로젝트 VS에서 : LoggingMigration: Migration 교체).

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에서 유래하지만 Migrator를에서 상속되는 클래스를 소개 할 수 마이그레이션 클래스를 수정할 수 없습니다 LoggingMigrator). 현재의 모든 마이그레이션에서'Up()'을'OverrideUp()'으로 바꿀 것을 제안하고 있습니까? –

+0

@MatasVaitkevicius 맞습니다. 그 중 하나 또는 사용자 정의 특성을 사용할 수 있지만 개체 지향 방식으로 충실 것입니다. –

-1

은 마이그레이션 클래스의 장식을 만듭니다. 데코레이터 패턴의

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