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));
또는 이와 비슷한 것입니다. 나는 도서관에서 뭔가를 간과 할 수도있다. 나는 사과한다.
는 실행'의 사용을 고려()'컨텍스트 데이터를 복용 과부하. 동일한 공통 정책을 사용할 수 있지만 다른 호출 위치에서 서로 다른 컨텍스트 데이터를 Execute()에 제공하십시오. 'onRetry' 델리게이트는이 'Context'를 매개 변수로받으며 그에 따라 행동을 포크 할 수 있습니다. –
위의 OnRetry는 내가 무엇을하고 싶은지 보여주기 위해 만든 것입니다. 하지만, 문맥에 따라 WaitAndRetryForever에게 먹이를주고, 아마도 그곳에 특별한 펑터를 넣을 수 있습니다 ... – Gordon
나는 모든 폴리 재시도 정책에 내장 된'onRetry' 델리게이트를 언급했습니다. 당신의'.OnRetry()'가 만들어졌습니다. 첫 번째 게시 된 코드 예제에서'(e, t, c) => {...} '코드는 onRetry 대리자입니다. 거기에있는'c' 입력 매개 변수는'Context'입니다. 이 매개 변수'c'는 컨텍스트 데이터를 전달하는 Execute() 오버로드로 전달 된 컨텍스트 데이터를 전달합니다. 따라서 동일한 공통 정책을 사용할 수 있지만 다른 호출 위치에서 다른 컨텍스트 데이터를 'Execute()'에 전달하여 onRetry 동작을 다양하게 할 수 있습니다. –