如何定义一个好的仓库接口?(关于IT技术)

4
我有以下情况:
我在收集主机数据。每个主机都有属性和状态的集合,并且这些主机被归为组。
每个组都有唯一的ID,每个主机也有唯一的ID。
所有组都被汇聚到一个单一的“存储库”中。
我目前正在使用以下数据结构:
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;
}

这目前是一个常规的内存数据结构实现,但我需要将所有内容保存在数据库中。

我想定义一个良好的抽象来允许:

  • 读取每个条目
  • 创建、更新和删除属性和状态
  • 添加和删除主机
  • 删除组

我阅读了一些有关存储库模式的文章,它似乎很合适,但我无法确定如何正确地定义接口。

我应该拥有一个存储库接口吗?还是应该为HostRepository、PropertyRepository、StatusReporitory等拥有单独的接口?


1
由于“每个组都有唯一的ID,每个主机也都有唯一的ID”,我期望在Host和Group类中看到一个“id”字段。 - Dele Taylor
1
像这样的内容(https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/)值得一读。请记住,DDD采用了Fowler的模式,并为其添加了额外的细微差别。例如,只有聚合根可以通过存储库获得。 - David Osborne
1个回答

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);
  ...

}

谢谢。如果在保存属性时我们还需要指定节点关系,即将属性添加到存在于节点中的主机上,您会这样做吗?void saveProperty(NodeId nodeId, HostId hostId, Property property); - Nir Brachel
如果属性的主机与所讨论的节点相关,则在保存属性时只需要主机的ID。否则,这样做是多余的,因为您可以通过其主机查找属性的节点。 - Dele Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接