Blocco multidimensionale if-elseif-else per chiamare diverse funzioni

0

Ho una funzione chiamata plugin ogni volta che l'endpoint "Plugin" di WebAPI viene chiamato nel progetto principale e che deve elaborare la richiesta HTTP. La richiesta contiene più informazioni su cosa fare nel metodo e nella stringa di query, e per ora ho copiato e incollato il codice per scegliere i metodi basati su questi:

public object OnCustomControllerCalled(Toolkit tk, HttpRequestMessage req)
{
    if (req.Method == HttpMethod.Get)
    {
        if (req.RequestUri.Query.Contains("data=Customers"))
        {
            return MyPlugin.GetCustomers(tk);
        }
        else if(req.RequestUri.Query.Contains("data=UserManagement"))
        {
            return MyPlugin.GetUserManagement(tk);
        }
        ...
    }
    else if (req.Method == HttpMethod.Post)
    {
        if (req.RequestUri.Query.Contains("data=Customers"))
        {
            return MyPlugin.PostCustomers(tk, req);
        }
        else if(req.RequestUri.Query.Contains("data=UserManagement"))
        {
            return MyPlugin.PostUserManagement(tk, req);
        }
        ...
    }
    else if (req.Method == HttpMethod.Put)
    {
        if (req.RequestUri.Query.Contains("data=Customers"))
        {
            return MyPlugin.PutCustomers(tk, req);
        }
        ...
    }
    else if (req.Method == HttpMethod.Delete)
    {
        ...

So che copiare e incollare non è un buon approccio a questo problema. Come faccio a renderlo facilmente estensibile e meno soggetto a errori?

Rifletti su di esso per raggiungere il principio ASCIUTTA?

O avrebbe senso avere una singola funzione MyPlugin.Customers invece di una per ogni metodo, e lasciare che quel singolo metodo contenga l'intero comportamento riguardante gli oggetti "cliente", e mantenere la differenziazione tra get, post, put e cancella in quella funzione?

    
posta Alexander 12.01.2018 - 12:50
fonte

1 risposta

3

Puoi utilizzare un approccio basato sull'eredità per questo.

Esempio:

public abstract class HttpAction
{
  public void Get();
  public void Put();
  public void Post();
  public void Get();
}

public class HttpActionFactory
{ 
  public void Get(string uri)
  { 
    if(uri.Contains("Customers")) return new CustomerHttpAction();
    //...
  }
}

public object OnCustomControllerCalled(Toolkit tk, HttpRequestMessage req)
{
  var action = HttpActionFactory.Create(req.RequestUri);
  if(req.Method == httpMethod.Get()) return action.Get();
  //...
}

Se si desidera aggiungere qualcosa di diverso da clienti o utenti, non è più necessario modificare il metodo OnCustomerControllerCalloller.

Puoi aggiungere una nuova classe ereditata da HttpAction ed estendere Factory.

    
risposta data 12.01.2018 - 14:33
fonte

Leggi altre domande sui tag