2

統合する必要があるサードパーティのサービスがあります。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());
    }
}
4

1 に答える 1