6

アプリケーションには、オブジェクトの軽量バージョンと重量バージョンの両方が必要です。

  • 軽量オブジェクトにはIDフィールドのみが含まれ、関連するクラスのインスタンスは含まれません。
  • 重量のあるオブジェクトには、IDとそれらのクラスのインスタンスが含まれます。

クラスの例を次に示します(説明のみを目的としています)。

public class OrderItem
{
    // FK to Order table
    public int OrderID;
    public Order Order;

    // FK to Prodcut table
    public int ProductID;
    public Product Product;

    // columns in OrderItem table
    public int Quantity;
    public decimal UnitCost;

    // Loads an instance of the object without linking to objects it relates to.
    // Order, Product will be NULL.
    public static OrderItem LoadOrderItemLite()
    {
        var reader = // get from DB Query
        var item = new OrderItem();
        item.OrderID = reader.GetInt("OrderID");
        item.ProductID = reader.GetInt("ProductID");
        item.Quantity = reader.GetInt("Quantity");
        item.UnitCost = reader.GetDecimal("UnitCost");
        return item;
    }

    // Loads an instance of the objecting and links to all other objects.
    // Order, Product objects will exist.
    public static OrderItem LoadOrderItemFULL()
    {
        var item = LoadOrderItemLite();
        item.Order = Order.LoadFULL(item.OrderID);
        item.Product = Product.LoadFULL(item.ProductID);
        return item;
    }
}

これを達成するために従うべき良いデザインパターンはありますか?

(上記の例のように)単一のクラスにコーディングする方法はわかりますが、インスタンスがどのように使用されているかはわかりません。コード全体でNULLチェックを行う必要があります。

編集: このオブジェクトモデルは、クライアントサーバーアプリケーションのクライアント側で使用されています。軽量オブジェクトを使用している場合、時間とメモリの浪費になるため、遅延読み込みは必要ありません(他の場所のクライアント側のオブジェクトはすでにメモリにあります)

4

4 に答える 4

3

遅延初期化、仮想プロキシ、およびゴーストは、遅延読み込みパターンの 3 つの実装です。基本的に、必要に応じてロード プロパティを参照します。さて、オブジェクトを保存するためにいくつかのリポジトリを使用することになると思いますので、利用可能な ORM ツールのいずれかを使用することをお勧めします。(Hibernate、Entity Framework など)、それらはすべてこれらの機能を無料で実装します。

于 2012-04-25T19:45:13.180 に答える
2

DB にアクセスするために NHibernate のような ORM ツールを使用することを検討しましたか? NHibernate などを使用すると、遅延読み込みによってこの動作が得られます。

ほとんどの ORM ツールは、遅延読み込み内で探していることを正確に実行します。最初にオブジェクト識別子を取得し、メソッドにアクセスすると、後続のクエリを発行して関連オブジェクトを読み込みます。

于 2012-04-25T19:40:47.017 に答える
0

データ転送オブジェクト(DTO)が必要なようですが、これはビジネスエンティティを要約する単なる「ダム」ラッパークラスです。表示するオブジェクトを平らにする必要がある場合、私は通常そのようなものを使用します。ただし、注意してください。使いすぎるとアンチパターンが発生します。

ただし、オブジェクトを表示用にレンダリングすることは、データベースに対するヒットを制限することとは異なります。ランドルフが指摘しているように、後者を意図している場合は、既存の遅延ロードパターンのいずれかを使用するか、ORMを使用することをお勧めします。

于 2012-04-25T20:14:41.597 に答える
0

レジストリパターンを見てみましょう。これを使用して、オブジェクトを検索したり、オブジェクトをキャッシュに保持するなど、これらのオブジェクトをより適切に管理したりできます。

于 2012-04-26T09:36:51.943 に答える