2012-05-17 2 views
2

У меня есть интерфейс приложения, который использует http post/get, используя xml-сообщения. Система интерфейса возвращает сообщение с кодами результатов и запрошенными данными. Коды результатов состоят из трех частей, кода и подкода, сгруппированных по типу (логин, запрос ...). Некоторые коды/подкоды представляют собой такие сообщения, как login successl, другие - исключения, такие как неверный логин или неверный запрос сообщения.Обработка результатов поиска кода из внешней системы - исключение метательных исключений

Я пытаюсь найти способ обработки результирующих кодов и выдачу исключения с сообщением, если это необходимо. Если код результата является информационным, просто примените сообщение к моему возвращенному сообщению пользователю api. Я смотрю на цепочку ответственности, но сталкиваюсь с блоком мозга, пытаясь проработать его.

Примеры кодов
тип .... Code..Subcode .... Описание
Войти ... 0 ..... 0 .......... запрос успешно
Войти ... 0 ..... nn ......... Войти успешно. «Nn» дней осталось до истечения срока действия
Логин ... 21 .... 1 .......... Ошибка входа. (Userid/password wrong).
Вход ... 21 .... 4 .......... Уже зарегистрировался
Вход ... 21 .... 5 .......... Системные ресурсы недоступны , Не удалось выделить объект безопасности
Request.50 .... 2 .......... service Недействительный синтаксис
Request.50 .... 3 .......... service Неверные атрибуты
Request.50 .... 4 .......... обслуживание Пакетный файл уже существует

Результат сообщения с кодами (код, субкода):
loginmanagerresult 0, 0 является информационным , все хорошо
loginresult 0, 24855 это учетная запись хорошо, не exipration не
если loginresult было 1, 2, бросок счет исключения заблокирован

<?xml version="1.0" encoding="UTF-8"?> 
    <loginmanagerresult sessionname="ALBHMROC9040RL1" code="0" subcode="0"> 
     <loginresult code="0" subcode="24855" sectoken="f1044f0aaad65ef2e28d4edc0663716f00000000"></loginresult> 
    </loginmanagerresult> 

У меня есть объекты, десериализованные в следующее: которые не могут быть изменены, расширены \ унаследованы, но нет дополнительных свойств \ функций.

public class LoginResult 
{ 

    private string code = ""; 
    [XmlAttribute("code")] 
    public string Code 
    { 
     get { return code; } 
     set { code = value; } 
    } 

    private string subCode = ""; 
    [XmlAttribute("subcode")] 
    public string SubCode 
    { 
     get { return subCode; } 
     set { subCode = value; } 
    } 

    private string secToken = ""; 
    [XmlAttribute("sectoken")] 
    public string SecToken 
    { 
     get { return secToken; } 
     set { secToken = value; } 
    } 

} 

[XmlRoot("loginmanagerresult")] 
public class LoginManagerResult 
{ 

    private string sessionName = ""; 
    [XmlAttribute("sessionname")] 
    public string SessionName 
    { 
     get { return sessionName; } 
     set { sessionName = value; } 
    } 

    private string code = ""; 
    [XmlAttribute("code")] 
    public string Code 
    { 
     get { return code; } 
     set { code = value; } 
    } 

    private string subCode = ""; 
    [XmlAttribute("subcode")] 
    public string SubCode 
    { 
     get { return subCode; } 
     set { subCode = value; } 
    } 

    private LoginResult loginResult = null; 
    [XmlElement("loginresult", IsNullable = true)] 
    public LoginResult LoginResult 
    { 
     get { return loginResult; } 
     set { loginResult = value; } 
    } 

    private QueryCapabilitiesResult queryCapabilitiesResult = null; 
    [XmlElement("querycapabilitiesresult", IsNullable = true)] 
    public QueryCapabilitiesResult QueryCapabilitiesResult 
    { 
     get { return queryCapabilitiesResult; } 
     set { queryCapabilitiesResult = value; } 
    } 

    private GetMotdResult getMotdResult = null; 
    [XmlElement("getmotdresult", IsNullable = true)] 
    public GetMotdResult GetMotdResult 
    { 
     get { return getMotdResult; } 
     set { getMotdResult = value; } 
    } 

    private LogOutResult logOutResult = null; 
    [XmlElement("logoutresult", IsNullable = true)] 
    public LogOutResult LogOutResult 
    { 
     get { return logOutResult; } 
     set { logOutResult = value; } 
    } 


} 

ответ

0

Что вы пытаетесь реализовать механизм «соответствует шаблону», цепочка обязанностей является своего рода другое название одно и то же в ООП. В C# нет встроенного способа для сопоставления структурных шаблонов, хотя вы можете посмотреть вокруг на SO или где-то еще, there are some generic ideas.

Если это всего лишь одноразовая вещь, вы можете попытаться просто составить список правил, которые будут выглядеть как пары (Predicate, Action). Затем метод Match будет проходить по правилам один за другим, а первое правило с возвратом Predicate true является совпадением и выполняется его действие.

Почему это может быть лучше, чем цепочка ответственности? Ну, вам не нужно много дополнительных объектов, вы можете использовать анонимные lambdas для указания предикатов и действий, а затем список правил будет просто вписываться в одну страницу кода, будет легко читаться, меняться, просматривать.

Ниже приведен краткий пример, который может быть дополнительно улучшен. Когда вы добавите дополнительные правила, вы сможете улучшить удобочитаемость, извлекая некоторые общие предикаты или части предикатов, а также некоторые действия или части действий в имена делегатов.

public class LoginResult 
{ 
    public string Code { get; set; } 
    public string SubCode { get; set; } 
    public string SecToken { get; set; } 
} 

public static IDictionary<Predicate<LoginResult>, Func<LoginResult, string>> rules = 
    new Dictionary<Predicate<LoginResult>, Func<LoginResult, string>> 
     { 
      { lr => lr.Code == "0" && lr.SubCode != "0", result => "Login successful, days left till expiration: " + result.SubCode }, 
      { lr => lr.Code == "0", _ => "Login successful" }, 
      { lr => lr.Code == "21", _ => ThrowInvalidOperation("Login failed. (Userid/password wrong).") }, 
     }; 

static string ThrowInvalidOperation(string message) 
{ 
    throw new InvalidOperationException(message); 
} 

static string Match(LoginResult result) 
{ 
    foreach (var rule in rules) 
    { 
     if (rule.Key(result)) 
     { 
      return rule.Value(result); 
     } 
    } 

    throw new ArgumentException("Matching rule not found", "result"); 
} 
Смежные вопросы