2

アプリケーションのドメイン コアには、Orderオブジェクトがあります。これらのプロパティは勝手に変更するべきではなく、オブジェクトに対してパブリック関数の 1 つを実行するコンテキスト内でのみ変更する必要があるため、プライベート セッターがあります。

public class Order
{
    public int Id { get; private set; }
    public int MarketplaceId { get; private set; }
    public int CustomerId { get; set; }
    public OrderStatus Status { get; private set; }

    public bool Validate() { //stuff }
    public void Fulfill()
    {
        //messes with order status, etc.
    }

}

私はOrderRepository、機能を持つ私のアーキテクチャの外縁にあるデータアクセス用を持っていGetOrderById(int orderId)ます。この関数は、データベースからプルしてOrderオブジェクトを設定します。オブジェクトにデータを入力できるようにする必要がありますが、オブジェクトを使用する他のアプリケーションやサービスがこれらのプロパティを設定するべきではないためOrder、プロパティをパブリックとして公開したくありません。Orderこれをどのように設計してOrder、リポジトリからオブジェクトを取り込みながら、オブジェクトのカプセル化を保持するにはどうすればよいOrderですか?

1 つ以上のコンストラクター (オーバーロード) を介してこれを行うのは面倒なようですが、他に何をすべきかわかりません。

4

4 に答える 4

0

この興味深い記事をご覧ください。あなたがやろうとしていることを要約しています:セッターを無効にしてドメインを強化する.

于 2013-05-17T08:17:05.997 に答える
0

その Order はオブジェクトですが、Domain オブジェクトではないことは確かです。Validate() と Fulfill() の場所はありませんが、それは別の話です。

ORM を使用しているかどうかは関係ありません。オブジェクトの状態がどのように格納されているかは問題です。あなたの場合、最も簡単な方法は、AutoMapper を使用して EF エンティティから Order にマップするか、(私はこのアプローチを支持します) コンストラクター引数として渡される OrderStateSave DTO を使用することです。

個人的には、オブジェクトを直接シリアル化することを好むので、復元は簡単な逆シリアル化です。簡単にするために、これは PK 列の横に Serialized 列があることを意味します。保存時の追加手順ですが、簡単です。

于 2013-05-17T10:47:13.773 に答える