2017-01-27 2 views
0

내 코드 전체에서 동일해야하는 여러 가지 정책이 있습니다. 예를 들어 :사용자 의견이있는 폴리 정책 작성

var myIOProblems = Policy 
    .Handle<IOException>() 
    .WaitAndRetryForever(i => TimeSpan.FromSeconds(2)); 

그럼 내가 일 할 것 몇 가지 코드해야합니다 :

myIOProblems 
    .Execute(() => otherPath.CopyTo(otherPathPart.FullName)); 

이 좋은 작품을, 나는 쓰레기 내 모든 코드를 통해 후자의 문,의 동작을 변경할 수 있습니다 하나의 중앙 장소, 그리고 모두 작동하는 것 같습니다.

그러나 일부 장소에서는 문제가 발생하는 피드백에 대해 사용자/프레임 워크에 제공해야합니다. 새로운 정책을 쓸 수 있습니다 :

Policy 
    .Handle<IOException>() 
    .WaitAndRetryForever(i => TimeSpan.FromSeconds(2), (e, t, c) => 
    { 
     count++; 
     statusUpdate.PCall($"Copying {otherPath.Name}: {other.Name} -> {Name} (retry ({count}): {e.Message})"); 
    }) 
    .Execute(() => otherPath.CopyTo(otherPathPart.FullName)); 

하지만 이제 공통 코드를 재사용 할 수 없게되었습니다. 필자가 정말로 쓸 수있는 것은 다음과 같습니다 :

myIOProblems 
    .OnRetry(e => statusUpdate.PCall($"Error ({e.Message}), retrying")) 
    .Execute(() => otherPath.CopyTo(otherPathPart.FullName)); 

또는 이와 비슷한 것입니다. 나는 도서관에서 뭔가를 간과 할 수도있다. 나는 사과한다.

+0

는 실행'의 사용을 고려()'컨텍스트 데이터를 복용 과부하. 동일한 공통 정책을 사용할 수 있지만 다른 호출 위치에서 서로 다른 컨텍스트 데이터를 Execute()에 제공하십시오. 'onRetry' 델리게이트는이 'Context'를 매개 변수로받으며 그에 따라 행동을 포크 할 수 있습니다. –

+0

위의 OnRetry는 내가 무엇을하고 싶은지 보여주기 위해 만든 것입니다. 하지만, 문맥에 따라 WaitAndRetryForever에게 먹이를주고, 아마도 그곳에 특별한 펑터를 넣을 수 있습니다 ... – Gordon

+0

나는 모든 폴리 재시도 정책에 내장 된'onRetry' 델리게이트를 언급했습니다. 당신의'.OnRetry()'가 만들어졌습니다. 첫 번째 게시 된 코드 예제에서'(e, t, c) => {...} '코드는 onRetry 대리자입니다. 거기에있는'c' 입력 매개 변수는'Context'입니다. 이 매개 변수'c'는 컨텍스트 데이터를 전달하는 Execute() 오버로드로 전달 된 컨텍스트 데이터를 전달합니다. 따라서 동일한 공통 정책을 사용할 수 있지만 다른 호출 위치에서 다른 컨텍스트 데이터를 'Execute()'에 전달하여 onRetry 동작을 다양하게 할 수 있습니다. –

답변

0

당신은 공장 클래스에서 정책을 포장 할 수 있고 getter 함수가 선택적으로 onRetry 콜백을받을 것이다 :

public class PolicyFactory 
{ 
    public static Policy GetMyPolicy(Action<Exception, TimeSpan, Context> onRetry = null) 
    { 
     return Policy 
      .Handle<IOException>() 
      .WaitAndRetryForever(i => TimeSpan.FromSeconds(2), onRetry); 
    } 
} 
관련 문제