2016-01-31 7 views
0

Я отношусь к IOC и DI, но я предполагаю, что здесь отсутствует какой-то высокоуровневый дизайн, но я не могу понять, как заставить мою архитектуру работать.Spring IOC DI с параметрами времени выполнения

У меня есть конечная точка REST API, которая принимает два элемента данных POST: идентификатор клиента и идентификатор типа. В остальном api необходимо вернуть набор данных для этой конкретной группы клиентов/типов.

Вот грубая картина того, что я делаю: enter image description here

Контроллер принимает объект идентификаторы, переданный в через почтовые данные, и через хранилище JPA получать соответствующие Entities для них.

Затем я создаю объект генератора данных (который принимает сущности в качестве параметров конструктора) и использует его для обработки всех сборок данных для API.

Проблема: потому что генератор данных принимает два динамических параметров конструктора, он не может быть DI'ed в контроллер, но вместо этого должны быть сделаны с new. Однако внутри Data Generator мне нужен доступ к репозиториям JPA. Единственный способ получить доступ к этим репозиториям - через DI. Однако я не могу DI, так как объект был new 'ed не DI'ed контейнером IOC.

Есть ли способ архитектовать это, чтобы у меня не было этой проблемы? Я нарушаю некоторые правила относительно МОК? Есть ли у меня неправильные предположения? Любые советы приветствуются.

Спасибо!

Edit: Псевдо-код для генератора данных

public class DataGenerator { 
    private Customer customer; 
    private Type type 

    public DataGenerator(Customer customer, Type type) { 
     this.cusomter = customer; 
     this.type = type; 
    } 

    public generateData() { 
     if(customer == x && type == y) { 
      //JPA REPOSITORY QUERY 
     } else { 
      //DIFFERENT JPA REPOSITORY QUERY 
     } 
    } 
} 
+0

Вопрос может быть более понятным, если бы предоставил короткий код генератора. –

+0

Спасибо за ввод - предоставлен псевдо-код. – Rece

ответ

1

Я думаю, что вы, возможно, получили спутать где-то вдоль линии. У вас должен быть Service, который попадает в ваши репозитории и предоставляет информацию контроллеру. Одна грубая настройка будет чем-то вроде этого.

@Controller 
public MyController { 

    @AutoWired 
    private DataService dataService; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    private DataGenerator readBookmark(@PathVariable Long customerId, @PathVariable Integer typeId) { 
     return dataService.getData(customerId, typeId); 
    } 
} 

@Service 
public class DataService { 

    @AutoWired 
    private JPARepository repository; 

    public DataGenerator getData(long customerId, int typeId) { 
     Type typeDetails = repository.getType(typeId); 
     Customer customerDetails = repository.getCustomer(customerId); 
     return new DataGenerator(customerDetails, typeDetails); 
    } 
} 
+0

Что делать, если мне нужен DataGenerator, чтобы что-то в него было введено. Я уточнил свой вопрос, чтобы сделать это более понятным. Например: DataGenerator должен иметь доступ к репозиториям JPA (как показано через комментарии), но поскольку он создается с помощью 'new', репозитории не могут быть введены. – Rece

+0

Почему? Что случилось с тем, что этот запрос запущен в '' 'DataService'''? – DominicEU

+0

Каждая комбинация Customer/Type будет иметь другой запрос для запуска. Я бы хотел, чтобы Data Generator абстрагировал это от пользователя (возможно, с некоторыми иерархиями классов), так как я думаю, что это даст лучший код. Возможно, IOC не разрешает это ... – Rece

Смежные вопросы