В C#, можно ли провести рефакторинг моих методов Post и Put, чтобы исключить дублирование кода? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть два следующих метода:

        private string Post(string url, ByteArrayContent content, AuthenticationToken token = null) {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            using HttpClient client = new HttpClient();
            if (token != null) {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Access_token);
            }

            return client.PostAsync(url, content)
                .Result.Content.ReadAsStringAsync()
                .Result;
        }

        private string Put(string url,  ByteArrayContent content,  AuthenticationToken token) {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            using HttpClient client = new HttpClient();
            if (token != null) {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Access_token);
            }

            return client.PutAsync(url, content)
                .Result.Content.ReadAsStringAsync()
                .Result;
        }

Как видите, разница только в том, что один метод вызывает PostAsync, а другой метод вызывает PutAsync.

Можно ли написать одну функцию, например:

        private string Send(string url,  ByteArrayContent content,  AuthenticationToken token, String functionName) {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            using HttpClient client = new HttpClient();
            if (token != null) {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Access_token);
            }

            return client[sendFunction](url, content)
                .Result.Content.ReadAsStringAsync()
                .Result;
        }

И тогда я смогу превратить каждую из других функций в один лайнер, например:

private string Post(string url, ByteArrayContent content, AuthenticationToken token = null) {
    this.Send(url, content, token, "PostAsync");
}

. .. Было бы даже лучше, если бы я мог передать функцию или имя функции таким образом, чтобы это было типично.

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Поиграв немного дальше с ответом Селвина, я смог придумать:

        private string Post(string url, ByteArrayContent content, AuthenticationToken token = null) {
            return this.Send(token, (client) => client.PostAsync(url, content));
        }

        private string Put(string url,  StringContent content,  AuthenticationToken token) {
            return this.Send(token, (client) => client.PutAsync(url, content));
        }

        private string Send(AuthenticationToken token,  Func<HttpClient, Task<HttpResponseMessage>> sendFunction) {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            using HttpClient client = new HttpClient();
            if (token != null) {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Access_token);
            }

            return sendFunction(client)
                .Result.Content.ReadAsStringAsync()
                .Result;
        }

... это почти то, что я хочу, но мне все еще нужен express "клиент «дважды.

Есть ли в C# какие-либо обозначения, которые позволят мне удалить эту избыточность?

Или мне следует принять это как« настолько хорошо, насколько это возможно »?

0 голосов
/ 09 июля 2020
• 1000 ваш asyn c вставляется в метод расширения
0 голосов
/ 09 июля 2020

Вы можете использовать выражение switch. Он стал на удивление функциональным в C # 8. Вы можете прочитать больше и найти примеры здесь:

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#switch -expressions

Upd: рассмотрите возможность использования перечисления вместо имен функций, чтобы сделать ваш код типизированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...