Reducir la lógica en el controlador API web -- # campo con .net camp codereview Relacionados El problema

Reduce logic in Web API controller


3
vote

problema

Español

Tengo el siguiente escenario: tengo una cuadrícula en la página web que se rellena con los datos. El usuario puede marcar las casillas de verificación en la cuadrícula y los datos se guardan en DB en la página de navegación a la página siguiente. Si luego navegan de nuevo a la página y eliminan una selección, los datos se eliminan del DB y también si la selección original aún está marcada, los datos no se guardan en el DB dos veces. Es una aplicación MVC 5 con SQL Server DB con marco de entidades: esta lógica en particular está contenida en mi controlador API web.

El siguiente es mi código para el método API:

   public HttpResponseMessage SaveCarModelSelect(CarModelSelectViewModel model)     {         var car = _carService.GetById(model.carId);          var splitSelectedCars = model.SelectedCars.Split(',').Select(sValue => sValue.Trim()).ToList();          // We only need to check if there are Car Models saved in the DB         if (car.CarModels.Count > 0)         {             var carsToRemove = CarModelsToRemoveFromDb(car, splitSelectedCars);              foreach (var carToRemove in carsToRemove )             {                 var carIdToDelete = car.RemoveCar(carToRemove);                 _carService.Delete(carIdToDelete);             }         }          foreach (var singleSelectedCar in splitSelectedCars)         {             var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)               .ToList();              if (!savedCarsInDb.Contains(singleSelectedCar))             {                 riskAppraisal.AddCar(singleSelectedCar);             }         }          _carService.Update(car);          return Request.CreateResponse(HttpStatusCode.OK);     }   

El método privado para CarmodelStoreMoveFromDB está debajo

      private static IEnumerable<string> CarModelsToRemoveFromDb (Car car, IEnumerable<string> splitSelectedCars)     {         var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)               .ToList();          return savedCarsInDb.Except(splitSelectedCars, StringComparer.OrdinalIgnoreCase);     }   

Supongo que alguien tiene sugerencias para mejorar esto: toda la funcionalidad está funcionando como se espera. Donde llamo al método AddCar, supongo que la lógica de la base de datos de cheques podría envolverse en otra si el .count is & gt; 0 Pero luego, si tuviera el AddCar (singleselectedCar) fuera de eso, se agregaría dos veces. El objetivo que estoy tratando de llegar es hacer que mi método API sea delgado y separe otra lógica en sus propios métodos.

Cualquier mejoras sugeridas apreciadas.

Original en ingles

I have the following scenario - i have a grid on web page that is populated with data. User can check a check-boxes in grid and data is saved to DB on navigating to next page. If they then navigate back to the page and remove a selection the data is deleted from the DB and also if the original selection is still checked the data is not saved to the DB twice. It is a MVC 5 application with SQL server db using Entity Framework - this particular logic is contained in my Web API controller.

The following is my code for the API method:

 public HttpResponseMessage SaveCarModelSelect(CarModelSelectViewModel model)     {         var car = _carService.GetById(model.carId);          var splitSelectedCars = model.SelectedCars.Split(',').Select(sValue => sValue.Trim()).ToList();          // We only need to check if there are Car Models saved in the DB         if (car.CarModels.Count > 0)         {             var carsToRemove = CarModelsToRemoveFromDb(car, splitSelectedCars);              foreach (var carToRemove in carsToRemove )             {                 var carIdToDelete = car.RemoveCar(carToRemove);                 _carService.Delete(carIdToDelete);             }         }          foreach (var singleSelectedCar in splitSelectedCars)         {             var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)               .ToList();              if (!savedCarsInDb.Contains(singleSelectedCar))             {                 riskAppraisal.AddCar(singleSelectedCar);             }         }          _carService.Update(car);          return Request.CreateResponse(HttpStatusCode.OK);     } 

The private method for CarModelsToRemoveFromDb is below

    private static IEnumerable<string> CarModelsToRemoveFromDb (Car car, IEnumerable<string> splitSelectedCars)     {         var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)               .ToList();          return savedCarsInDb.Except(splitSelectedCars, StringComparer.OrdinalIgnoreCase);     } 

I'm guessing has anyone got suggestions to improve this - all the functionality is working as expected. Where I call the AddCar method I suppose the checking database logic could be wrapped in another if the .Count is > 0 but then if I had the AddCar(singleSelectedCar) outside that it would get added twice. The Goal I am trying to get to is make my API method thin and separate out other logic into their own methods.

Any suggested improvements appreciated.

     

Lista de respuestas

1
 
vote

Para limpiar su controlador, se me ocurrió esto:

  • La lógica completa se mueve a su CarService
  • MÉTODO CarModelsToRemoveFromDb también se mueve a CarService
  • CarService3 tiene dos sobrecargas para el método Update

MÉTODOS PARA CarService :

  private IEnumerable<string> CarModelsToRemoveFromDb (Car car, IEnumerable<string> splitSelectedCars) {     var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)         .ToList();      return savedCarsInDb.Except(splitSelectedCars, StringComparer.OrdinalIgnoreCase); }  public void Update(CarModelSelectViewModel model) {     var car = GetById(model.carId);     var splitSelectedCars = model.SelectedCars.Split(',').Select(sValue => sValue.Trim()).ToList();      if (car.CarModels.Count > 0)     {         var carsToRemove = CarModelsToRemoveFromDb(car, splitSelectedCars);          foreach (var carToRemove in carsToRemove )         {             var carIdToDelete = car.RemoveCar(carToRemove);             Delete(carIdToDelete);         }     }      foreach (var singleSelectedCar in splitSelectedCars)     {         var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)             .ToList();          if (!savedCarsInDb.Contains(singleSelectedCar))         {             riskAppraisal.AddCar(singleSelectedCar);         }     }      Update(car); }  public void Update(Car car) {     //your current logic }   

controlador:

  public HttpResponseMessage SaveCarModelSelect(CarModelSelectViewModel model) {     _carService.Update(model);     return Request.CreateResponse(HttpStatusCode.OK); }   

lógica que comprueba el recuento de automóvil (car.CarModels.Count > 0) también se puede separar al método privado, lo mismo para el bucle foreach (var singleSelectedCar in splitSelectedCars) .

Espero que pueda darle algún sentido de la dirección.

 

To clean up your controller I came up with this:

  • entire logic is moved to your CarService
  • method CarModelsToRemoveFromDb is also moved to CarService
  • CarServicehas two overloads for method Update

Methods for CarService:

private IEnumerable<string> CarModelsToRemoveFromDb (Car car, IEnumerable<string> splitSelectedCars) {     var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)         .ToList();      return savedCarsInDb.Except(splitSelectedCars, StringComparer.OrdinalIgnoreCase); }  public void Update(CarModelSelectViewModel model) {     var car = GetById(model.carId);     var splitSelectedCars = model.SelectedCars.Split(',').Select(sValue => sValue.Trim()).ToList();      if (car.CarModels.Count > 0)     {         var carsToRemove = CarModelsToRemoveFromDb(car, splitSelectedCars);          foreach (var carToRemove in carsToRemove )         {             var carIdToDelete = car.RemoveCar(carToRemove);             Delete(carIdToDelete);         }     }      foreach (var singleSelectedCar in splitSelectedCars)     {         var savedCarsInDb = car.CarModels.Select(c=> c.ModelId)             .ToList();          if (!savedCarsInDb.Contains(singleSelectedCar))         {             riskAppraisal.AddCar(singleSelectedCar);         }     }      Update(car); }  public void Update(Car car) {     //your current logic } 

Controller:

public HttpResponseMessage SaveCarModelSelect(CarModelSelectViewModel model) {     _carService.Update(model);     return Request.CreateResponse(HttpStatusCode.OK); } 

Logic that checks count of Car (car.CarModels.Count > 0) can also be separated out to private method, same for loop foreach (var singleSelectedCar in splitSelectedCars).

I hope it can give you some sense of direction.

 
 
 
 

Relacionados problema

10  Obteniendo la última fecha donde ocurrió un día de la semana dado  ( Getting the last date where a given week day occurred ) 
Estoy tratando de aprender un poco sobre la programación funcional y como mi herramienta, elegí F # ya que soy un desarrollador de .NET y el medio ambiente es...

11  Nested Si las declaraciones con 3 parámetros diferentes  ( Nested if statements with 3 different parameters ) 
Tengo un bloque de código a continuación. El método allDone() en la parte inferior solo debe ejecutarse si el 9988776655544331 . Debe recorrer cada una de ...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

12  Intento de un algoritmo de clasificación  ( Attempt at a sorting algorithm ) 
He estado jugando y leyendo algunos algoritmos de clasificación, y he decidido intentar escribir mi propia. Resultó ser bastante rápido (en comparación con lo...

2  Observable  ( Observablequeue ) 
Estoy buscando comentarios sobre esto. public sealed class ObservableQueue<T> : IObservable<T>, IDisposable { private readonly object _lock = new objec...

19  Clase de matriz en C #  ( Matrix class in c ) 
He estado aprendiendo C # durante mi tiempo libre en los últimos meses; Antes de eso, en su mayoría estaba escribiendo Java, por lo que la transición no ha si...

11  ¿Se pueden mejorar estas pruebas de la unidad?  ( Can these unit tests be improved ) 
No soy el más grande en las pruebas de escritura aún y estoy iniciando un nuevo proyecto OSS para aprender y, como parte, quiero abordar ser más efectivo en l...

21  Determinar si se ha realizado una conexión en un dispositivo de comunicaciones  ( Determining if a connection has been made to a communications device ) 
No estoy seguro de si mi uso de '0','1','2','3'5 y '0','1','2','3'6 es correcto. Parece que funciona bien, pero hay una duda molesta que estoy haciendo al...

5  Implementación de la cola prioritaria en C #  ( Priority queue implementation in c ) 
Mi aplicación tiene un hilo para el manejo de inserciones y actualizaciones de la base de datos. Los datos se añaden por otras roscas a una cola genérica en e...

3  Desernializando JSON con UTF8JsonReader  ( Deserializing json with utf8jsonreader ) 
Ruta del exilio es un juego de PC donde los jugadores pueden enumerar sus artículos para la venta. El juego tiene una API pública que sirve a JSON que conti...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos