jeudi 7 février 2019

Design pattern to consume REST API

I am making a dll to consume a REST API in aspnetcore.

Ideally, I would like it to be accessed this way:

API api = new API(clientInfo);
api.Module.Entity.Action(params);

But I am struggling to make that a reality. I can't make anything static because more than 1 session might be instanced at the same time. I can't pass the session around except by reference otherwise session state(cookies etc.) might change in the copy. Is there a design pattern I should be using?

public class API
{
    private Session _session;
    public API(ClientInfo clientInfo)
    {
        _session = new Session(clientInfo);
    }
}

The session serves as middleware for the client, stores login data in case the client needs to repeat login, handles some errors/retries and exposes client methods.

public class Session
{
    private Client _client;
    private string _path;
    public Session(ClientInfo clientInfo)
    {
        _client= new Client(clientInfo);
        _path = clientInfo.Path;
    }
    public HttpResponseMessage Get(string name, string arguments = "")
    {
        return _client.Get(_path, name, arguments);
    }
    ...
}

The client actually performs the calls.

public class Client
{
    public HttpResponseMessage Get(string path, string endpointName, string arguments)
    {
        return GetClient().GetAsync(path + endpointName + arguments).Result;
    }
    private HttpClient GetClient(){...}
    ...
}

Aucun commentaire:

Enregistrer un commentaire