2016-11-03 6 views
1

, 나는 로그를 저장하는 DbContext 클래스에 대한 확장 방법이 : 그럼확장 방법과 상속

public static int SaveChangesWithLogging(this DbContext context, NLog.Logger logger) 
{ 
    //logging 
    //[...] 

    return context.SaveChanges(); 
} 

을, 나는 dbcontext에서 상속하는 클래스를 가지고 내가 SaveChanges를()

을 무시할 경우
public class ChildDbContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     //other stuff 
     //[...] 

     //doesn't work, no definition for SaveChangesWithLogging (extension method not found, why ?) 
     return base.SaveChangesWithLogging(); 


     //doesn't work, loop on SaveChanges by extension method and stack overflow as a result 
     return base.SaveChangesWithLogging(); 
    } 
} 

나는 기본 DbContext 클래스의 SaveChanges를()를 호출 할하지만 ChildDbContext의 SaveChanges를()를 호출하거나 내가 루프 및 스택 오버플로가 ...

이 좋은 SOLU 무엇입니까 기각?

+0

"루프와 스택 오버플로가 있습니다 ..."무엇? 루프는 어디에 있습니까? 아니면'StackOverflowException'을 일으키는 끝없는 재귀를 가지고 있다는 것을 의미합니까? 어쨌든 문제는 XY 문제처럼 보입니다. 'SaveChanges'에서'SaveChanges'를 호출하는 이유는 무엇입니까? 이것은 부서진 디자인처럼 보인다. 상속 사슬에서 어떤 메소드를 호출해야 하는지를 알려주지 않아야합니다. 가장 많이 파생 된 메소드입니다. 다른 것을하면 OOP 원리가 깨질 것입니다. – HimBromBeere

답변

1

확장 메서드가 숨겨져 실제 문제는 외부에서 재정의 된 메서드를 호출하려고했으나 불가능하다는 것입니다. 실제 개체는 ChildDbContext이므로 재정의 된 메서드는 SaveChangesWithLogging에 의해 호출됩니다. 메쏘드 후에 메쏘드를 던지더라도 SaveChangesWithLogging에서 "base"메쏘드를 호출하는 방법이 없습니다.

기본 메서드를 파생 된 메서드에서 호출하거나 비가 상 메서드를 사용하여 기본 메서드를 직접 호출 할 수 있도록 호출 계층을 다시 정렬하는 것이 좋습니다.

0

마지막으로, 내 dbcontext에 대한 래퍼를 사용합니다.