2016-01-22 2 views
0

Я ищу лучшее решение в данных данных: один контроллер с методом Put с двумя строками в качестве параметров: key и jsonValue.Архитектурная проверка внутри контроллера

Что мне нужно сделать: проверить, является ли jsonValue действительным типом <key> и вставить в Db.

То, что я сделал, это создать перечисление всех <key> возможностей и внутри Put я написал переключатель на (Enum.Key)

Enum.TryParse(key, true, out configType); 

switch (configType) 
{ 
    case ConfigType.Configuration: 
     if(IsValid(key, value)) 
      Insert(); 
     break; 

    case ConfigType.Configuration2: 
     ... 

private bool IsValid(key, value) 
{ 
    Enum.TryParse(key, true, out configType); 

     switch (configType) 
     { 
      case ConfigType.Configuration: 
       var values = JsonConvert.DeserializeObject<IEnumerable<ConfigData>>(value); 
       if (!routingConfigurationData.Any()) 
        return false; 
       break; 
      case ConfigType.Configuration2: 
       ... 

} 

Это довольно нуб вещь ... Я думал создать фабрику , ConfigurationFactory с методом Create, который вернет общий тип на основе ключа (я могу сопоставить ключ с типом) ... но для метода Create мне нужно 4-5 классов для каждого типа (например, подписи Configuration Create, Configuration2 Create => T Create).

Можете ли вы дать мне несколько лучших идей?

Спасибо, ребята!

+0

Избавьтесь от большого корпуса корпуса переключателя, используя цепочку ответственности. – vendettamit

ответ

1

Вот демонстрация того, как вы можете преобразовать ваш код из корпуса коммутатора в цепочку ответственности.

интерфейс и объект запроса для абстракции реализации:

public interface IProcessor 
{ 
    public bool Process(ProcessRequest request); 
    public bool IsResponsible(); 
} 

/// <summary> 
/// Add any data required to supply to the processors. 
/// </summary> 
public class ProcessRequest 
{ 
    public ConfigType Type { get; set; } 

    public string Value { get; set; } 
} 

Теперь базовый класс для выполнения каких-сантехнические работ делать бизнес принятия решения о исполняющем производных методах класса.

public abstract class ProcessorBase : IProcessor 
{ 
    protected IProcessor successor; 

    public ProcessorBase(IProcessor successorObj) 
    { 
     this.successor = successorObj; 
    } 

    public bool Process(ProcessRequest request) 
    { 
     if (request == null) 
     { 
      throw new ArgumentNullException("request"); 
     } 

     if (this.IsResponsible(request.Type)) 
     { 
      return this.InnerProcess(request); 
     } 
     else 
     { 
      return this.successor.Process(request); 
     } 
    } 

    public abstract bool InnerProcess(ProcessRequest request); 

    public abstract bool IsResponsible(ConfigType type); 
} 

Теперь идут ваши конкретные классы, которые будут фактическим процессором для обработки ваших данных конфигурации.

public class Configuration1Processor : ProcessorBase 
{ 
    public Configuration1Processor(IProcessor successor) 
     : base(successor) { } 
    public override bool InnerProcess(ProcessRequest request) 
    { 
     var values = JsonConvert.DeserializeObject<IEnumerable<ConfigData>>(request.Value); 
     if (routingConfigurationData.Any()) 
     { 
      return true; 
     } 

     return false; 
    } 

    public override bool IsResponsible(ConfigType type) 
    { 
     return type == ConfigType.Configuration1; 
    } 
} 

public class Configuration2Processor : ProcessorBase 
{ 
    public Configuration2Processor(IProcessor successor) 
     : base(successor) { } 

    public override bool InnerProcess(ProcessRequest request) 
    { 
     // here goes the business logic 

     return false; 
    } 

    public override bool IsResponsible(ConfigType type) 
    { 
     return type == ConfigType.Configuration2; 
    } 
} 

Теперь нам нужен класс метода строителя, который будет действовать как завод для создания объектов конкретного процессора и построения цепочки.

public static class ProcessorChainBuilder 
{ 
    public static IProcessor Build() 
    { 
     return new Configuration1Processor(
       new Configuration2Processor(null) 
      ); 
    } 
} 

Использование -

Enum.TryParse(key, true, out configType); 

ProcessorChainBuilder.Build().Process(new ProcessRequest 
{ 
    Type = ConfigType, 
    Value = value 
}); 

Примечание - в этот момент вы должны думать, почему я должен написать это много шаблонного кода, когда простой переключатель случай может работать. Ну, вот как вы строите архитектуру и пишете расширяемый код. Рассмотрим ситуацию, для добавления нового типа процессора вам просто нужно создать новый процессор Concrete и добавить его в цепочку в методе Build().

+0

Это замечательно! –

1

Вы можете создать Dictionary<YourEnum,Func<boo>> и вы можете вызвать его в вашем методе IsValid как return dictionary[YourEnum]();

Вы можете выбрать, как определить ваш Func<bool> т.е. в классе конфигурации, который выставляет их, встроенный в том же классе, и т.д. Надеюсь это поможет.