2016-09-22 2 views
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; 
} 

これは、現在、メモリデータ構造 で正規として実装されているが、私は、データベース内のすべてを保存する必要があります。 私が私を可能にする優れた抽象定義したい:アップデートを作成し、プロパティを削除するには、各項目

  • を読むには

    • をし、グループ
    • を削除するには、ホスト
    • を追加したり削除したりする
    • をステータス

    私はリポジトリパターンに関するいくつかの記事を読んで、それは適切だと思われますが、インターフェイスを正しく定義する方法を理解できません。

    1つのリポジトリインタフェースが必要ですか? または、私はHostRepository、PropertyRepository StatusReporitoryのための別のインターフェイスを用意する必要があります...

  • +1

    "各グループには一意のIDがあり、各ホストには一意のIDがある"ので、ホストとグループのクラスに "id"フィールドが表示されます。 –

    +1

    このようなもの(https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/)は読む価値があります。 DDDはFowlerのパターンを取り、さらにそれにニュアンスを追加することを覚えておいてください。例えば。リポジトリを介して利用可能な集約ルートのみです。 –

    答えて

    1

    個別のリポジトリインターフェイスを持つことができますが、ここでは1つしか使用しない方法があります。

    これらのクラスは、テーブル(またはNoSQL DBのドキュメント)に簡単にマッピングできます。

    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

    プロパティのホストが問題の同じノードに関連している場合は、プロパティを保存するときにホストのIDだけが必要です。ホストを介してプロパティのノードをルックアップできるので、そうしないと冗長になります。 –

    関連する問題