В genericDao можно не иметь n-переменных @Autowired - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь создать CRUD с как можно меньшим количеством кода, основываясь на: Не повторяйте Дао;У меня есть пара вопросов:

  1. Существует способ не создавать переменную для каждой таблицы в моей базе данных: userService, phoneService, n тысяч таблиц
  2. Если это невозможно.Как я мог из String получить эти переменные для вызова функций Dao?

In Контроллер

String model = "phone"
Class<?> abc = model+"Service"; ??
Class<?> def = model; ??
abc.read(def, 1);

??

Дао

public interface GenericDao<E, K> {
 public E read(Class<E> type, K id);
}

@Repository
public class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> {
 @Autowired
 private SessionFactory sessionFactory;
 @Override
 public E read(Class<E> type, K id) {
  return currentSession().get(type, id);
 }
}

Сервис

public interface GenericService<E, K> {
 public List<E> read(Class<E> type);
}

@Service
@Transactional
public class GenericServiceImpl<E, K> implements GenericService<E, K> {
 @Autowired
 private GenericDao<E, K> dao;
 @Override
 public E read(Class<E> type, K id) {
  return dao.read(type, id);
 }
}

Контроллер

@RestController
@RequestMapping("/{model}")
public class CrudController extends Controller {
 @Autowired
 protected GenericService<User, Integer> userService;
 @Autowired
 protected GenericService<Phone, Integer> phoneService;
 @GetMapping("/{id}")
 public ResponseEntity<Object> read(@PathVariable String model, @PathVariable Integer id) {
  Object object = phoneService.read(Phone.class, id);
  return ResponseEntity.ok(object);
 }
}

1 Ответ

0 голосов
/ 19 февраля 2019

На одной из моих предыдущих работ я работал над настольным приложением Eclipse RCP.Это был ERP, так что подумайте о большом количестве таблиц базы данных, с которыми ему приходилось иметь дело, и обо всех возможных параметризациях.

Архитектура была полностью универсальной , и под этим я подразумеваю, чтокаждое представление основывало свое представление на некоторых метаданных .Хотя этот подход на первый взгляд может показаться хорошим, он только так себе.Сильное обобщение означает множество компромиссов в общем дизайне, обобщение - это сумасшествие во время отладки, потому что, в общем-то, все проходит там!
Обобщение означает сумасшествие при сопровождении кода.Как насчет конкретных вариантов использования?Вы должны справиться с этим так или иначе.

Типичное веб-приложение не такое большое, оно не имеет дело с сотнями таблиц.Поэтому не бойтесь повторять один и тот же шаблон Controller - Service - Repository .Это называется разделением интересов и даже инкапсуляцией данных и поведения.

Держите ваши пакеты хорошо организованными, и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...