Какой шаблон проектирования использовать родительский и дочерний класс с дочерним методом?

Я сталкивался с этой проблемой много раз, когда хотел создать класс отношений родитель-потомок.
У меня есть базовый класс AuthenticateRequest. В моем случае у меня есть 2 дочерних запроса, но у них есть собственная логика для GetContent().
На самом деле это не относится ни к составному шаблону, ни к замена Лисков в качестве базовый метод уникален и вызывается.
Какой шаблон проектирования следует использовать?

public class AuthenticateRequest
{
    public string Url { get; set; }

    public string ContentType { get; set; }

    public string Method { get; set; }

    public virtual HttpContent GetContent()
    {
        return new StringContent("");
    }
} 

public class SoapAuthenticateRequest : AuthenticateRequest
{
    public string SoapMethodName { get; set; }

    public string SoapAction { get; set; }

    public string KeyForUserNameParameter { get; set; }

    public string ValueForUserNameParameter { get; set; }

    public string KeyForPasswordParameter { get; set; }

    public string ValueForPasswordParameter { get; set; }

    public override HttpContent GetContent()
    {
        var methodName = this.SoapMethodName;
        var keyUsername = this.KeyForUserNameParameter;
        var keyPwd = this.KeyForPasswordParameter;
        var valueUsername = this.ValueForUserNameParameter;
        var valuePwd = this.ValueForPasswordParameter;
        var soapAction = this.SoapAction ?? @"http://tempuri.org/"; 

        var soap = $@"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""><soap:Body><{methodName} xmlns=""{soapAction}""><{keyUsername}>{valueUsername}</{keyUsername}><{keyPwd}>{valuePwd}</{keyPwd}></{methodName}></soap:Body></soap:Envelope>";

        return new StringContent(soap, Encoding.UTF8, ContentTypes.XmlSoap);
    }
}

public class JsonAuthenticateRequest : AuthenticateRequest
{
    public string SoapMethodName { get; set; }

    public string SoapAction { get; set; }

    public Dictionary<string, string> ParameterKeyValues { get; set; }

    public override HttpContent GetContent()
    {
        var json = JsonConvert.SerializeObject(ParameterKeyValues);
        return new StringContent(json, Encoding.UTF8, ContentTypes.Json);
    }
}

public async Task<AuthenticateResponse> Authenicate(AuthenticateRequest request)
{
    var requestMsg = new HttpRequestMessage
    {
        RequestUri = new Uri(request.Url),
        Method = new HttpMethod(request.Method.ToString()),
        Content = request.GetContent(),
    };

    var responseMsg = await _httpClient.SendAsync(requestMsg).ConfigureAwait(false);
    var responseContent = await responseMsg.Content.ReadAsStringAsync().ConfigureAwait(false);

    return new AuthenticateResponse
    {
        Message = responseContent,
        IsSuccess = Regex.Match(responseContent, (string)request.RegexForValidUser).Success
    };
}

person sky91    schedule 25.06.2018    source источник
comment
Не кодируйте (дизайн-)паттерн. Любой шаблон может быть правильным или неправильным, если он выполняет свою работу. Сказав это, ваш вопрос в значительной степени основан на мнении, поэтому я голосую за его закрытие.   -  person HimBromBeere    schedule 25.06.2018
comment
Что не так с кодом, который у вас есть? как-то сложно понять, чего ты хочешь. (сказано самым приятным образом)   -  person TheGeneral    schedule 25.06.2018
comment
@HimBromBeere Я не могу найти похожий вопрос в stackoverflow. Я надеюсь, что этот вопрос может быть подсказкой для других. Ответ может быть основанным на мнении или рекомендациях.   -  person sky91    schedule 25.06.2018


Ответы (1)