Как вернуть список сотрудников в Controller, учитывая логический параметр, fx api / employee? HasOvertime = true - PullRequest
1 голос
/ 08 марта 2020

Я создал класс сотрудников и EmployeeWebSerivce,

Мне нужно создать класс контроллера, который предоставляет три конечные точки HTTP: api / employee (GET)

Возвращение списка всех сотрудников. Учитывая логический параметр hasOvertime, конечная точка должна иметь возможность фильтровать список сотрудников с помощью EmployeeService. Например: api / employee? HasOvertime = true.

api / employee (POST)

Взятие объекта Employee в теле запроса и сохранение его в списке сотрудников.

API / платежей (GET)

Возврат суммы всех ежемесячных платежей. Подобно другому методу GET, вы должны иметь возможность фильтровать по времени, учитывая логический параметр.

Я не знаю, как вызывать методы из класса EmployeeWebService.

 public class Employee
{
    public String Name { get; set; }
    public double HourlyWage { get; set; }
    public double HoursPerMonth { get; set; }
    public double GetMonthlyPay()
    {

        double overTimeHours= HoursPerMonth - 150;
        double pay;

        if(overTimeHours <= 0)
        {
            pay = HourlyWage * HoursPerMonth;
        }
        else
        {
            pay = (150 * HourlyWage) + (overTimeHours * HourlyWage * 1.5);
        }
        return pay;


    }

EmployeeWebService

public class EmployeeWebService
{

    private List<Employee> FilterEmployeeBasedOnOverTime(List<Employee> employee, bool hasOvertime = false)
    {
        return employee.Where(e => hasOvertime ? e.HoursPerMonth > 150 : e.HoursPerMonth <= 150).ToList();


    }
    private double GetTotalMonthlyExpense(List<Employee> employees)
    {
        return employees.Sum(e => e.GetMonthlyPay());
    }

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Добро пожаловать в Сообщество SJcoder. Итак, поскольку вы используете. NET Core, вы можете использовать Dependency Injection. Если вы не знакомы с концепцией, перейдите по этой ссылке здесь . Также я изменил ваш «GetMonthlyTotalExpense» с двойного на десятичный. Узнайте, почему здесь

Сначала вам понадобится интерфейс IEmployeeWebService. Это будет выглядеть следующим образом:

 public interface IEmployeeWebService
 {
    List<Employee> FilterEmployeeBasedOnOverTime(List<Employee> employee, bool hasOvertime = false);
    decimal GetTotalMonthlyExpense(List<Employee> employees);
 }

Затем вы должны реализовать этот интерфейс. Таким образом, реализующий класс будет выглядеть следующим образом:

  public class EmployeeWebService : IEmployeeWebService
  {
    public List<Employee> FilterEmployeeBasedOnOverTime(List<Employee> employee, bool hasOvertime = false)
    {
        return employee.Where(e => hasOvertime ? e.HoursPerMonth > 150 : e.HoursPerMonth <= 150).ToList();

    }

    public decimal GetTotalMonthlyExpense(List<Employee> employees)
    {
        return employees.Sum(e => e.GetMonthlyPay());
    }
  }

Затем вы должны указать DI-контейнеру, к какому классу будет преобразован интерфейс. Вам может быть интересно, что делает AddScoped <> (). Посмотрите эту ссылку , это помогло мне понять. Ваш класс запуска будет выглядеть следующим образом:

     public void ConfigureServices(IServiceCollection services)
     {
        services.AddScoped<IEmployeeWebService, EmployeeWebService>();
     }

И теперь в вашем контроллере вы можете использовать сервис и его методы так:

    public HomeController(IEmployeeWebService employeeWebService)
    {
        _employeeWebService = employeeWebService;
    }

    public IActionResult Index()
    {
        List<Models.Employee> filteredResults = _employeeWebService.FilterEmployeeBasedOnOverTime(employees, true);
        return View(filteredResults);
    }

Я не знаю, как вы получают ваших сотрудников, но если вы получаете их из базы данных, вы можете передать это в качестве параметра службе. Я надеюсь, что это помогает, и любые вопросы, пожалуйста, прокомментируйте:)

0 голосов
/ 08 марта 2020

Вы можете создать экземпляр класса контроллера следующим образом:

var controller = new EmployeeWebService();

Затем вы можете вызвать методы следующим образом:

var result = controller.FilterEmployeeBasedOnOverTime(someEmployee, false);

Проблема, с которой вы столкнетесь, заключается в том, что методы являются частными, и поэтому вы не можете вызывать их из другого класса. Вы можете прочитать больше о модификаторах доступа здесь: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

...