2013-03-28 4 views
0

저는 애플 리케이션에 상당히 핵심적인 몇 가지 확장 메소드를 가지고 있습니다. 난 그들을 사용하여 내 OData 서비스에 대한 모든 호출을 중앙 예외 처리기를 통해 라우팅합니다. 그것은 다음과 같습니다Unity Resolve를 필요로하는 확장 메소드

var results = Entites.Customers.Where(x=>x.IsActive).Invoke(); 

Invoke() 내 확장 방법이며, 모든 위대한 작품!

하지만 예외가 발생하면 기록하고 싶습니다.

문제의 I의 발견은 나의 ILoggerstatic 클래스 내에 해결 될 수없는 (이 확장 메서드를하는 정적 필요가있는 클래스.)

화합 관리 인터페이스를 해결하기 위해 어떤 방법이 있나요 static 클래스 안에 있습니까? 또는 Dependency Injection 패턴이이 C# 기능에 대처할 수 없습니까?

+1

@IlyaIvanov 또는 단지'경우 (X => x.IsActive)' – Servy

+1

간단한 해결책이있다 : 확장 방법을 사용하지 마십시오가. 일단 'Invoke'메소드가 자체 의존성을 필요로하면 자체 서비스를 얻고 다른 모든 서비스를 주입하는 것처럼 주입해야합니다. 그 편리한 확장 메소드 구문을 더 이상 사용할 수 없습니다. 그것으로 살아라. – Steven

답변

2

하나의 옵션은 정적 클래스에서 구현되지 않는 것입니다. 확장 메서드가 아닌 메서드의 구현을 포함하는 비 정적 클래스를 만든 다음 확장 메서드가 비 확장 구현을 호출하는 외에 아무 작업도 수행하지 않도록합니다.

그런 다음 구현은 더 이상 정적 클래스가 아닙니다.

public static class MyExtension 
{ 
    public static void Invoke<T>(this IQueryable<T> query) 
    { 
     MyExtensionImplementation.Invoke(query); 
    } 
} 

internal class MyExtensionImplementation 
{ 
    public static void Invoke<T>(IQueryable<T> query) 
    { 
     //actual work 
    } 
} 
+0

이 방법으로 문제가 실제로 해결되는지 궁금합니다. 이 접근법은 어떤 이점을 제공합니까? ILogger를 확장 메소드 안에 어떻게 주입할까요? – Warlock

+0

@Warlock 예, 문제가 해결되었습니다. 이점은 구현이 정적 클래스 내에 있지 않다는 것입니다. 특히 OP가 말한 문제가 무엇 이었습니까? 아이디어는 로거를 삽입하는 것이 아니라 클래스가 자신 만의 아이디어를 얻는 것이지만 정적이라면 그렇게 할 수 없습니다. – Servy

+0

실제로 하나의 정적 메서드 구현을 다른 것으로 위임합니다.내게 더 이해하기 쉽도록 "MyExtensionImplementation"클래스에 조금 더 많은 코드를 제공해 주시겠습니까? :) 또는 외부 리소스에 대한 링크를 제공 하시겠습니까? 나는이 솔루션에 정말로 관심이있다. 고마워요 – Warlock

1

나쁜 소식 -이, 좋은 소식을 할 수있는 방법은 없습니다 - 당신이 당신의 확장 메서드 내부 예외를 로그인 할 필요가 없습니다. 예외를 정적 클래스 외부로 던져서 적절한 방식으로 처리하도록합니다.

IResult results; 
try 
{ 
    results = Entites.Customers.Where(x=>x.IsActive).Invoke(); 
} 
catch(YourOwnException ex) 
{ 
    Log(ex, "The Business logic error."); 
} 
catch(ArgumentException ex) 
{ 
    Log(ex, "Invalid arguments.") 
} 
... 
catch(Exception ex) 
{ 
    Log(ex, "Unknown error."); 
} 

편집 :

대부분이 관련 통신하며 확장 방법으로 처리 될 것이다. 비즈니스와 관련된 몇 가지만이 으로 다시 처리됩니다.

예외가 "통신 관련"또는 제 3자인 경우 로그하지 않아도됩니다. 이 경우 로깅없이 TryInvoke() 메서드를 만들고 성공 작업에 대해 TRUE을 반환하며 OUT 매개 변수가 있습니다. 로그에 기록하려면 Invoke() 방법 안에 ILogger을 주입해야합니다. 더 나은 아직

if(Entites.Customers.Where(x=>x.IsActive).TryInvoke(out results)) 
{ 
    // Success 
} 
+1

+1, 던져 질 때가 아니라 처리 될 때 로그 예외 만. – Justin

+0

대부분은 통신 관련이며 확장 메서드에서 처리됩니다. 비즈니스와 관련된 몇 개만 다시 태어납니다. – Vaccano

관련 문제