2013-11-19 5 views
3

Я хотел бы следовать принципу дизайна separation of concerns в новом веб-приложении Java EE. Если я правильно понимаю, это означает, что я должен сохранить технический выбор моего DAL (уровня доступа к данным), невидимый для моего модельного/бизнес-уровня.Многоуровневая архитектура и постоянные аннотации на бобы модели?

Как я использую Spring Data Neo4j, я должен аннотировать мои модельные бобы, например. «@NodeEntity», аннотация, которая относится к Spring Data Neo4J. Кажется, что это сочетание уровня модели с уровнем доступа к данным.

  • Является ли это хорошим анализом, который я здесь делаю?
  • Если да, то как я могу создать модель, которая не зависит от моего DAL, используя аннотации Spring Data Neo4j?

Благодарим за помощь!

ответ

4

Общим решением является применение принципа программирования по интерфейсам, создание интерфейсов для каждого объекта и отношений и реализация их с помощью аннотированных классов SDN. Таким образом, слой модели будет обращаться к объектам только через интерфейсы, не имея знаний о реализации. К операциям доступа к астральной базе данных вы можете создавать интерфейсы DAO и реализовывать их с репозиториями SDN и/или запросами Cypher. Пример:

public interface Item { 
    String getName(); 
    ... 
} 

public interface ItemDAO { 
    Item lookup(String name); 
    ... 
} 

@NodeEntity 
public class ItemNode implements Item { 
    @GraphId private Long id; 
    private String name; 
    ... 
    public String getName() { return name; } 
    ... 
} 

public class Neo4jItemDAO implements ItemDAO { 
    ... 
    @Override 
    public Item lookup(String name) { 
     return neo4jOperations.lookup(ItemNode.class,"name", name).to(ItemNode.class).singleOrNull(); 
    } 
} 

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

@Autowired ItemDAO itemDAO; 
Item item = itemDAO.lookup("name"); 
+1

интерфейс DAO имеет то же назначение интерфейсов сущностей, создать уровень абстракции между моделью и уровень доступа к данным. Использование GraphRepository напрямую нарушает эту абстракцию, подвергая SDN слою модели. – remigio

+0

Спасибо за идею интерфейсов, но у меня все еще есть вопрос. В настоящий момент для каждого модельного класса, например, «Пользователь», я создал интерфейс «UserRepository», который расширяет GraphRepository . Нужно ли мне создавать новый интерфейс UserDAO, или это то же самое, что интерфейс UserRepository? Другими словами, насколько стандартным является интерфейс GraphRepository Spring Data Neo4j? –

+0

Хорошо, спасибо, думаю, теперь я понимаю. –

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