2016-09-22 3 views
4

У меня есть следующая ситуация:Как определить хороший интерфейс репозитория

Я собираю данные на хостах. Каждый хост имеет коллекции свойств и статусов. и хосты собраны группами.

Каждая группа имеет уникальный идентификатор, и каждый узел имеет уникальный идентификатор

и все группы собраны в одном «хранилище».

настоящее время я использую следующую структуру данных:

public class Host { 
    private final Map<PropertyId, Property> properties; 
    private final Map<StatusId, Status> statuses; 
} 

public class Group { 
    private final Map<HostId, Host> hosts; 
} 

public class AllGroups { 
    private final Map<GroupId, Group> groups; 
} 

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

  • Чтобы прочитать каждый пункт
  • для создания обновления и удаления свойств и статусы
  • добавлять и удалять узлы
  • для удаления групп

Я прочитал несколько сообщений о шаблоне хранилища и, похоже, подходит, но я не могу понять, как правильно определить интерфейсы.

Должен ли я иметь 1 интерфейс репозитория? Или мне нужно иметь отдельные интерфейсы для HostRepository, PropertyRepository StatusReporitory ...

+1

Поскольку «у каждой группы есть уникальный идентификатор, и каждый хост имеет уникальный идентификатор», я бы ожидал увидеть поле «id» в классах Host и Group. –

+1

Что-то вроде этого (https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/) стоит прочитать. Имейте в виду, что DDD использует шаблон Фаулера и добавляет к нему дополнительные нюансы. Например. только общие корни доступны через репозиторий. –

ответ

1

У вас могут быть отдельные интерфейсы репозитория, но вот подход, использующий только один.

Эти классы могут быть легко сопоставлены с таблицами (или документами в базе данных NoSQL).

public class Property { 
    private String name; 
    private Object value; 
} 

public class Host { 
    private long id; 
    private List<Property> properties; 
    private List<Property> statuses; 
} 

public class HostGroup { 
    private long id; 
    private List<Host> hosts; 
} 

public interface HostRepository { 

    List<HostGroup> getAllGroups(); 
    HostGroup getGroupById(long id); 
    HostGroup saveGroup(HostGroup HostGroup); 
    boolean deleteGroup(HostGroup HostGroup); 

    Host getHostById(long id); 
    Host saveHost(Host host); 
    boolean deleteHost(Host host); 

    Property getProperty(long hostId, String propertyName); 
    void saveProperty(long hostId, Property property); 
    ... 

} 
+0

Спасибо. Что делать, если при сохранении свойства нам также нужно указать связь с узлом. свойство добавляется к узлу, который существует в узле, вы бы сделали что-то подобное? void saveProperty (NodeId nodeId, HostId hostId, Свойство); –

+0

Если хост объекта связан с одним и тем же узлом, то вам нужно только идентификатор хоста при сохранении свойства. Было бы излишне делать иначе, так как вы можете искать узел свойства через свой хост. –

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