4

私はオブジェクトを持っています:図書館

1 つのライブラリには、複数の本、CD、および論文を含めることができます。各クラスには、Address プロパティを持つ Library クラスを除いて、Id、Name、および Price プロパティがあります。

上のレイヤーからデータが保存されている場所を抽象化するリポジトリパターンを作成したいと思います。現在、データはxmlファイルに保存されています。

<library>
<books></books>
<cds></cds>
<papers></papers
</library>

後で、データベースに保存することを考えています。次に、ライブラリ テーブル、書籍テーブル、CD テーブル、および論文テーブルを作成します。

ユーザーは画面上にライブラリ オブジェクトを作成し、次に画面上に本、CD、および論文を作成します。

次に、[保存] をクリックします。その時点で、新しく作成したライブラリ オブジェクトを取得して XML に保存したいので、リポジトリが必要です。依存性注入を使用して、上のレイヤーに xml リポジトリの実装を挿入し、データが正しい場所に保存されるようにします。ライブラリ オブジェクトをシリアル化して xml を取得し、単純な Save メソッドを呼び出してライブラリ オブジェクトを保存できます。

しかし、XMLRepository を DatabaseRepository に置き換えると想像してください。

その場合、上のレイヤーの残りの部分は変更しないでおきたいと思います。LibraryRepository.Save() が、XML、CSV、または DB のいずれに入れる必要があるかどうかを気にかけていることを願っています。LibraryRepository.Save() メソッドを解決するためにリポジトリ パターンを作成する方法がわかりません。

どこにいても、Repository クラスは単一の責任を持つべきだと言います。1 つのオブジェクト タイプのみを保存する必要があり、オブジェクトを取らず、関連するクラスを取り、それらも保存する必要があります。各クラスには、独自の Repository クラスが必要です。

また、各ライブラリ オブジェクトには複数の Books オブジェクトがあります。for ループを使用して、LibraryRepository.Save メソッドで各本を調べたくありません。

ドメイン モデルを作成し、Library Save() メソッドを呼び出す方法がわかりません。

ガイドしてください。

4

1 に答える 1

2

リポジトリは BL の永続性の抽象化であるため、リポジトリ インターフェイスを使用します。

各リポジトリの実装では、データ ストレージへのオブジェクト構造のマッピングを処理するか、特定のマッパーを使用する必要があります。BL/Service クラスは、特定のリポジトリの内部実装に関する知識がなくても、インターフェイスを介してリポジトリと連携します。

だからあなたは次のようなものを持っているでしょう

class LibraryService {
    public LibraryService (ILibraryRepository repo) {} 
    public DoSomeWork(somedata) {
        Library lib = repo.Load(somedata.libid);
        ....
        repo.Save(lib);
    }
}

そしていくつかの実装

class DBLibraryRepository : ILibraryRepository {
    public Save(Library lib) {
        //hibernate session 
        //and you'll have mapping defined for all entities
        //and relations between library and stuff, so books are saved automatically
        _session.Save(lib)
    }
}

class XMLLibraryRepository : ILibraryRepository {
    public Save(Library lib) {
        //serialized does all the work, so no additional loops here
        var xml = Serialize(lib);
        SaveToFile(xml);
    }
}

class CSVLibraryRepository : ILibraryRepository {
    public Save(Library lib) {
        //for example, save library to lib.csv, books - to books.csv.
        //add mappers to do real work, but we'd take care of separation 
        //of books and library manually.
        // (in case of ORM - it has own mappers, 
        //  for XML - serializator is mapper itself)
        var data = LibraryCSVDataMapper.Map(lib);
        data.Save();
        foreach(var book in lib.Books){
            data = BookCSVDataMapper.Map(book);
            data.Save();
        }
    }
}
于 2012-05-28T10:58:53.767 に答える