統合する必要があるサードパーティのサービスがあります。3 つのコールに対して 3 つのエンドポイントがあります。それだけです。各 API 呼び出しには、独自の wsdl を持つ独自のエンドポイントがあります。そのため、異なる呼び出しの POCO 間に (継承などの) 接続はありません。しかし、これらの呼び出しの結果は非常に似ています。特に、すべての結果には、パイプで区切られた文字列にエラーを含む 'Errors' プロパティがあります。一部のエラーは呼び出し間で共有され (同じ名前を持つ)、同様の方法で処理する必要があります。
私の目標は、例外が発生したか、エラーに「EXCEPTION」という名前のエラーがあるときに呼び出しを再試行することです。この目標を達成するために Polly を使用しようとしています。私が今見ている唯一の方法は、呼び出しごとに個別のポリシーを作成することです。すべての通話に対して単一のポリシーを作成する方法はありますか?
サンプル コードは次のとおりです (実際のプロジェクトでは、wsdl をインポートするときに、VisualStudio によって *Result クラスと *Service インターフェイスが自動生成されます)。
public partial class CreateResult
{
public string Errors {get;set;}
}
public interface ICreateService
{
Task<CreateResult> CreateAsync();
}
public partial class UpdateResult
{
public string Errors {get;set;}
}
public interface IUpdateService
{
Task<UpdateResult> UpdateAsync();
}
public partial class DeleteResult
{
public string Errors {get;set;}
}
public interface IDeleteService
{
Task<DeleteResult> DeleteAsync();
}
public class Connector
{
private readonly ICreateService _createService;
private readonly IUpdateService _updateService;
private readonly IDeleteService _deleteService;
private readonly Policy _policy = ???;
public Connector(ICreateService createService, IUpdateService updateService, IDeleteService deleteService)
{
_createService = createService;
_updateService = updateService;
_deleteService = deleteService;
}
public async Task<CreateResult> CreateAsync()
{
// sample policy: var policy = Policy.Handle<Exception>()
// .OrResult<CreateResult>(r => r.Errors.Contains("EXCEPTION"))
// .Retry();
// Now I need to create such a policy for every call. How can I create a single policy or a factory method to enforce DRY principle?
return _policy.ExecuteAsync(() => _createService.CreateAsync());
}
public async Task<UpdateAsync> UpdateAsync()
{
return _policy.ExecuteAsync(() => _updateService.UpdateAsync());
}
public async Task<DeleteResult> DeleteAsync()
{
return _policy.ExecuteAsync(() => _deleteService.DeleteAsync());
}
}