1

これは、DDDに頭を悩ませている私の周りに基づいたシリーズの一部を形成します:)

前の質問に続きますが、背景知識は必要ありません。基盤となるデータベースに関係がある場合に、別のシステムからWCFサービスを消費するシステム

ドキュメントシステムとHRシステムがあります。HRシステムは、ドキュメントと、ドキュメントに関連するHR固有のデータを保存する必要があります。

私が最初に考えたのは、ドキュメントシステムへの呼び出しは、HRシステムのアプリケーションサービスで行う必要があるということでした(不要なコードは削除されました)。

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

リポジトリは次のようになります。

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        _session.Save(hrDocument);
    }
}

しかし、Jak Charltonはこの記事で、 「リポジトリの背後にあるものは何ですか?ほとんど何でも好きです。そうですね。正しく聞こえました。データベースを使用することも、さまざまなデータベースを使用することもできます。リレーショナルデータベースまたはオブジェクトデータベースを使用できます。 。メモリ内データベース、またはメモリ内アイテムのリストを含むシングルトンを持つことができます。RESTレイヤー、SOAサービスのセット、ファイルシステム、またはメモリ内キャッシュを持つことができます…」

だから今、私はサービスがこれだけであるべきだと思っています:

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

次のように、リポジトリ内のドキュメントライブラリサービスを呼び出します。

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        hrDocument.DocumentLibraryId = documentLibraryId;
        _session.Save(hrDocument);
    }
}

このように、間違いなく、担当者は依然として永続性にのみ責任があります。

私はここで正しい方向に進んでいますか、それとも離れていますか?

4

2 に答える 2

3

他のシステムからアプリケーション サービスにアクセスするリポジトリは、かなり受け入れられている方法のようです。Microsoft Application Architecture Guideは、これを「サービス エージェント」の形で提唱しており、上記の Jak Charlton の引用もそれをサポートしています。データ アクセスにNHibernateを使用している場合は、IUserType を実装することでこれを行うことができます。これは普遍的なソリューションではありません。たとえば、コレクションを返し、各エンティティがその子エンティティに対して WCF 呼び出しを行う必要がある場合、パフォーマンスが低下します。システムの統合について尋ねると、人々はメッセージングと CQRS を主張することがよくありますが、Udi Dahan 自身でさえ、これは大多数のシステムには適していないと主張しています。

于 2011-09-03T13:34:00.143 に答える
0

ドメイン サービスはリポジトリとエンティティの前にあるため、HRDocumentRepository 内で DocumentLibraryService を使用することは「DDD 準拠」ではありません。

あなたの最初の考えは正しかったです!

ただし、ロジック自体 (永続化する前にエンティティに値を割り当てる) は、サービスからではなくリポジトリから情報を取得できる限り、リポジトリ内で完全に有効です。

お役に立てれば。

ロバート

于 2011-07-07T08:08:46.833 に答える