2

EFコードファーストを使いたいです。リポジトリパターンを使用しています。そして、n層アーキテクチャを実装したいと思います。私が本当に望んでいるのはTDDを使用することですが、集約ルートで問題が発生しています。私の問題はこれです...

ブログオブジェクトがあります。このブログオブジェクトから、関連するファイルを追加できます。素晴らしい。したがって、基本的に、リポジトリを作成するための1つの集約ルートがあり、ブログに関連ファイルを「追加」できるようにするいくつかのメソッドを追加する必要があります。しかし、私はこれをどこに置きますか?それはデータアクセス層のものなので、私は本当にそこに欲しいです。しかし、正直なところ、それはビジネスロジックの課題でもあります。製品の一部は、assocファイルを追加できるようにすることです。では、AssocファイルをDALまたはBLLに追加するロジックを配置する必要がありますか?

誰かが私にいくつかのガイドラインを教えてくれることを願っています。

4

3 に答える 3

1

あなたはリポジトリと集約ルートについて話しているので、DDDを実行したいと言っていると思います。DDDには、システムのユーザーと一緒に開発するモデルであるドメインモデルが必要です。いずれにせよ、それは通常のユーザーが理解すべき概念で構成されている必要があります。したがって、ユーザーがブログを関連付けられたファイルがあるものと見なし、これらのファイルをブログに追加できる場合、関連付けられたファイルはドメインモデルに属し、ブログオブジェクトにはaddメソッドが必要です。私の推測では、BLLはそれらの関連ファイルを配置したい場所です。

于 2012-04-14T09:19:39.323 に答える
1

まず、制限されたコンテキストを理解するまで、集約ルートを識別できません。明確なBSがなければ、ARはありません。コンテキストに応じて、オブジェクトをARにすることができます。私はあなたのドメインを知らないので、私はブログがファイルを追加するために必要な情報を有効とみなします。したがって、追加機能はARにあります。

リポジトリは、永続性に関連するすべてを処理します。つまり、データベースに保存します。この場合、単一のメソッドが含まれている必要があります。

public interface IBlogFilesRepository
 {
     void Save(Blog);
 }

ドメイン/ビジネスロジックは常にドメイン/BLレイヤーに配置します。DALはデータベースへの保存/ロードのみを処理し、ドメインの動作を処理するビジネス(原文のまま)はありません。

于 2012-04-14T13:23:39.407 に答える
0

あなたが言ったことはTDDの文脈ではほとんど意味がないので、TDDではなくDDDを意味していると思います。

あなたは座って、ファイルがあなたのシステムにとって何を意味するのかを考える必要があります、ファイルと投稿を接続するルールはありますか?たとえば、投稿を削除した場合、ファイルには何が必要ですか?それらも削除しますか?同じファイルを複数の投稿に「追加」できますか?あなたは座って、考え、そしてあなたのファイルについての知識を集め、そしてあなたはそれがあなたのドメインで紹介される場所に値するかどうかを決定します。

私が想像できるいくつかのサンプルドメイン:

public class Post
{
    private List<File> _files;
    public IEnumerable<File> AssociatedFiles {get {return _files;}}
    public void AssociateFile(File file){//...}
    public void DisassociateFile(File file ){//...}

    //It doesn't delete it just do some logic. Maybe we can't delete this post and need to throw exception or whatever logic you need
    public void Delete()
    {
        foreach (File file in AssociatedFiles) DisassociateFile(file);
    }
}

public class File 
{
    public String Url;
    public DateTime Created;
    public DateTime Modified;
}

public class PostRepository
{
    public void Delete(Post post)
    {
        post.Delete();
        DbContext<Post>.Delete(post); //I Don't remember EF syntax for this
        DbContext.SaveChanges();
    }
}

更新:続けましょう...

あなたのドメインについて5分間考えた後、私の最初の設計には重要な概念が欠けていることがわかりました(DDDの場合はいつものように、知識を少しずつ削っていきます)。

ファイルのアップロードは誰が担当しますか?ユーザーは、すでにアップロードしたファイルを投稿に関連付けることができますか?新しいファイル(アップロードされていない)ファイルを投稿に追加できますか?彼はこれを混ぜることができますか?これらは重要な質問です。ここでも、それについて考え、システムを設計する必要があります。

于 2012-04-14T09:37:07.520 に答える