Дизайн для CRUD

#c# #oop #design-patterns

#c# #ооп #шаблоны проектирования

Вопрос:

У меня есть требование для разработки приложения CRUD. В БД есть три таблицы — сотрудники, Продажи и Клиенты. Значения для этих таблиц доступны в трех разных таблицах. Мое приложение должно периодически проверять электронную таблицу и обновлять соответствующую таблицу. Я придумал следующий дизайн

EmpMgr — EmpDAL — EmpDAO

SalesMgr — SalesDAL — SalesDAO

CustMgr — CustDAL — CustDAO

Таймер в моем основном приложении будет периодически запускать и получать электронную таблицу, доступную в настроенном местоположении, и вызывать функцию синтаксического анализа в EmpMgr, SalesMgr или CustMgr . Соответствующие классы анализируют файл и формируют «Вектор EmpDao / SalesDao / CustDao» и вызывают соответствующий DAL для обновления таблицы.

Мое опасение по поводу этого подхода

  1. Синтаксический анализ файла excell может повторяться во всех классах Mgr. Если я хочу создать универсальный анализатор, как мне заставить его возвращать конкретный «Вектор DAO»?
  2. Сегодня данные взяты из excell, возможно, они будут изменены на XML или даже веб-сервис. Как я должен убедиться, что мой дизайн будет учитывать изменения?

Комментарии:

1. Это не должно быть первым местом, на которое нужно обратить внимание, когда вы сталкиваетесь с проблемой.

Ответ №1:

Вам не хватает модели (думаю, MVC). Это должно решить обе ваши проблемы. Я не думаю, что вам понадобится слой DAL.

например, для таблицы Excel, содержащей список сотрудников. У вас должен быть конкретный класс для сотрудников. Список сотрудников может храниться в контейнере списка. Ваш DAO проанализирует Excel и превратит каждую строку в объект employee или примет объект employee и добавит его в качестве строки в Excel.

Для вашего первого вопроса ваш код может выглядеть следующим образом.

 class EmployeeManager()
{
   ...

   public void CreateEmployee(Employee employee)
   {
       dao.Add(employee);
   }

   public void CreateEmployees(List<Employee> employees)
   { 
       dao.AddMany(employees);
   }

   ...

   public List<Employee> GetAllEmployees()
   {
       List<Employee> employees = dao.GetAll();
       employees.Sort();
   }

   ...
}

class Employee()
{
   Employee(string name, string job)
   {
      Name = name;
      Job = job;
   }

   ...

   string Name { get; set; }
   string Job { get; set; }
}

class EmployeeDAO()
{

   ...

   public List<Employee> GetAllEmployees() 
   {

        List<Employee> employees = new List<Employee>;

        //parse all rows and make make employee objects out of them.

        return employees;           
   }

}
  

Для Q1, используя модель, вы будете использовать контейнеры, предоставляемые C #, Для хранения списка сотрудников, их можно искать, сортировать, Изменять и т. Д., А код уже сделан для вас, проверен и протестирован для вас и написан людьми намного умнее вас.

Для Q2, если вы измените из Excel в XML или что-нибудь еще, все, что вам нужно сделать, это изменить DAO. Все, что использует менеджер, нужно будет использовать только классы в вашей модели и использовать контейнеры, уже имеющиеся в C #.