Рефакторинг кода, чтобы сделать более общий метод - PullRequest
0 голосов
/ 06 мая 2018

Я хочу попытаться реорганизовать этот метод немного лучше, в то время как у меня возникли некоторые трудности в понимании асинхронности. У меня есть проект web api2, в котором я использую свой слой доступа к данным, чтобы поделиться им с телефонным приложением. Я не уверен, что у меня правильный синтаксис. Я использую общую библиотеку xamrian здесь, в приложении форм xamrian.

У меня будут различные методы link get клиенты, которые будут иметь API / клиенты конечной точки, но obv их тип возврата будет другим.

Как сделать так, чтобы нижеследующее работало хорошо при представлении списка:

Как бы я также использовал приведенный ниже метод, какова общая практика - сохранять задания локально в sql lite.

public string BaseUrl { get; set; }
public string EndPoint { get; set; }

Давайте перейдем к веб-службе и возьмем список заданий.

public async List<Job> GetJSON()
{
        List<Job> rootObject = new List<Job>();

        try
        {
            var client = new System.Net.Http.HttpClient();
            var response = await client.GetAsync("http://myinternaliis/api/job");
            string json = await response.Content.ReadAsStringAsync();
             if (json != "")
            {
                rootObject = JsonConvert.DeserializeObject< List<Job>>(json);
            }

        }
        catch (InvalidCastException e)
        {
            throw e;
        }
        return await rootObject;

 }

Спасибо за помощь в улучшении моего понимания.

1 Ответ

0 голосов
/ 06 мая 2018

Я думаю, вы ищете что-то вроде:

public async Task<T> GetJson<T>(string url)
{
    using (var client = new System.Net.Http.HttpClient())
    {
        var response = await client.GetAsync(url);
        var json = await response.Content.ReadAsStringAsync();

        return (T)JsonConvert.DeserializeObject<T>(json);
    }
}

Обычно у меня есть:
IApi - определяет все методы API
IHttpService - определяет методы типа Get, Post и т. Д.
IJsonConverter - определяет методы, такие как сериализация и десериализация.

Вот пример:

public interface IJsonConverter
{
    T Deserialize<T>(string json);
    string Serialize<T>(T data);
}

public class JsonConveter : IJsonConverter
{
    public T Deserialize<T>(string json) => JsonConvert.DeserializeObject<T>(json);
    public string Serialize<T>(T data) => JsonConvert.Serialize(data);
}

public interface IHttpService
{
    Task<T> Get<T>(string url);
}

public class HttpService : IHttpService
{
    readonly IJsonConverter jsonConverter;

    public HttpService(IJsonConverter jsonConverter)
    {
        this.jsonConverter = jsonConverter;
    }

    public async Task<T> Get<T>(string url)
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            var response = await client.GetAsync(url);
            var json = await response.Content.ReadAsStringAsync();

            return jsonConverter.Deserialize<T>(json);
        }
    }
}

public interface IApi
{
    Task<List<Job>> GetJobs();
}

public class Api : IApi
{
    readonly string url = "http://myinternaliis/api/";
    readonly IHttpService httpService;

    public Api(IHttpService httpService)
    {
        this.httpService = httpService;
    }

    public Task<List<Job>> GetJobs() => httpService.Get<List<Job>>($"{url}job");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...