0

現在、DDD に飛び込んでおり、Eric Evans の大きな青い本のほとんどを読みました。これまでのところ非常に興味深い:)

有効期限が切れるエンティティのコレクションを保持するいくつかの集計をモデル化しています。私はそれを表現する一般的なアプローチを思いつきました:

public class Expirable<T>
{
    public T Value { get; protected set; }
    public DateTime ValidTill { get; protected set; }

    public Expirable(T value, DateTime validTill)
    {
        Value = value;
        ValidTill = validTill;
    }
}

Expirable を無効にする (セットで作業する場合は無効にするか省略する) 最善の方法が何か知りたいです。これまでのところ、リポジトリコンストラクターでそれを行うことを考えていました。これは、集約にアクセスし、「コレクション」として機能する場所だからです。

誰かがこれに取り組むための解決策を思いついた場合、私はそれを聞いてうれしいです:)他のアプローチも大歓迎です。

2013 年 10 月 1 日更新:

これは、Greg Young による CQRS/ES アプローチによる DDD ではありません。しかし、私は本と最初のアプリから始めたばかりだったので、Evans が取ったアプローチです。Greg Young が言ったように、良いテーブルを作る必要がある場合は、最初にいくつか作る必要があります ;)

4

3 に答える 3

1

これにアプローチする方法はおそらく複数ありますが、個人的には、仕様パターンを使用してこれを解決します。オブジェクトの有効期限がドメインに属するビジネス ルールであると仮定すると、作成したクラスに加えて仕様が必要になります。次に例を示します。

public class NotExpiredSpecification
{
    public bool IsSatisfiedBy(Expirable<T> expirableValue)
    {
        //Return true if not expired; otherwise, false.
    }
}

次に、リポジトリが集計のリストを返すとき、またはセットに対してビジネス アクションを実行するときに、これを利用してセットを期限切れでない値に制限し、コードを表現力豊かにし、ビジネス ロジックをドメイン内に保持できます。

仕様パターンの詳細については、このペーパーを参照してください。

于 2013-01-04T22:15:09.347 に答える
0

CQRS/ES (Greg Young アプローチ) を使用した DDD について調べており、MSDN サイトで CQRS/ES に関する優れた例を見つけました: http://msdn.microsoft.com/en-us/library/jj554200.aspx

この例では、コマンド メッセージ キューを使用して、将来の期限切れメッセージをキューに入れます。これにより、指定された時間に集合体が呼び出され、集合体から期限切れのコンストラクトが削除/非アクティブ化されます。

于 2013-01-10T22:30:26.540 に答える
0

抽象リポジトリにメソッドを追加しましたInvalidateExpirable。例は、次のUserRepositoryようなアクティブなユーザー セッションで削除する場所ですInvalidateExpirable(x => x.Sessions, (user, expiredSession) => user.RemoveSession(expiredSession));

の署名は InvalidateExpirable次のようになりますprotected void InvalidateExpirable<TExpirableValue>(Expression<Func<T, IEnumerable<Expirable<TExpirableValue>>>> selector, Action<T, Expirable<TExpirableValue>> remover)。メソッド自体は、リフレクションを使用して、選択されたプロパティをセレクター パラメーターから抽出します。そのプロパティ名は、remove ラムダを呼び出すセットをトラバースする一般的な HQL クエリに接着されています。user.RemoveSessionアグリゲートからセッションを削除します。このようにして、私は集計がそれ自身のデータを担当するようにします。また、RemoveSession将来のケースのためにドメイン イベントが発生します。

例については、https ://gist.github.com/4484261 を参照してください。

ただし、アプリケーションのさらに下でどのように機能するかを確認する必要があります。

于 2013-01-05T19:52:32.300 に答える