2

DAL に Customers のリストを返すメソッドがあります。

Collection<Customer> FindAllCustomers();

顧客には次の列があります: ID、名前、住所、経歴

これらの列のみを表示する ASPX フォーム (show-customers.aspx) のページ グリッドにそれらを表示する必要があります: ID、名前

今、私の DAL FindAllCustomers() で、SP から Bio フィールドも返しますか (リーダーを使用してコレクションに入力しています)。Bio フィールドは大きくなる場合があります (nvarchar(max))。遅延読み込みまたは必要なフィールドのみを読み込むことを考えていました。しかし、その場合、バイオを含む顧客の「完全な」リストを返す別のメソッドを作成して、サードパーティのアプリがサービスレイヤーを介して使用できるようにする必要があります。したがって、次のようなメソッドを作成しても問題ありません。

Collection<Customer> FindAllCustomers(bool loadPartial);

loadPartial = true の場合、Bio をロードせず、そうでない場合はロードします。この場合、SP から Bio を返したくないので、bool 値に基づいて SP に 2 つの select ステートメントを作成する必要があります。

ここで遅延読み込みを使用してもうまくいかないと思います.DALメソッドはサードパーティのアプリからアクセスでき、バイオも読み込みたいと思うかもしれません.

そのような場合に実装するための最良のパターンに関する提案はありますか?

ありがとう、

ヴィカス

4

8 に答える 8

3

サードパーティのことはバインドです。

一見したところ、通常は最小限のデータのみを通常どおりロードしてから、要求に応じて完全または詳細をロードすることをお勧めします(つまり、プロパティに触れるとDB呼び出しがトリガーされる可能性があります-おそらくプロパティの軽度の悪用)またはバックグラウンドプロセスベース、あなたがしていることの性質に応じて。

明確化のための遅延プロパティコード:

class Customer
{
  private string _lazydata = null;

  public string LazyData
  {
    get
    {
      if (this._lazydata==null)
      {
        LazyPopulate();
      }
      return this._lazydata;
    }
  }

  private void LazyPopulate()
  {
    /* fetch data and set lazy fields */
  }
}

これには注意してください。多くの DB 呼び出しを行いたくはありませんが、怠惰なものを見るたびにボトルネックを作成したくはありません。これが適切かどうかを判断できるのは、アプリの性質だけです。

サードパーティがあなたと同じ理由で軽量バージョンを望んでいる可能性が非常に高いという理由で、ブールフラグメソッドを作成する有効なケースがあると思います(私はデフォルトで軽量バージョンを使用します)。

私は一緒に行きます:

Collection<Customer> FindAllCustomers()
{
  return this.FindAllCustomers(false);
}

Collection<Customer> FindAllCustomers(bool alldata)
{
  /* do work */
}
于 2009-08-11T20:53:48.170 に答える
3

その場合、列挙型を使用して、パラメーターの意味をさらに明確にします。

public enum RetrieveCustomerInfo
{
   WithBio,
   WithoutBio
}

メソッドを呼び出すと、次のようになります。

dao.FindAllCustomers(RetrieveCustomerInfo.WithBio);

良いかどうかはわかりませんが、より明確になったと思います。

于 2010-01-19T20:51:20.813 に答える
1

顧客のリストに略歴が表示されない場合は、簡素化されたバージョンを使用しても問題ありません。

いくつかの質問...

  • そのパラメーターは、バイオがロードされているかどうかのみを決定しますか? 将来的に、true に設定したときにロードされない他のフィールドはありますか?
  • loadPartial が true に設定されている場合に Bio にアクセスしようとするとどうなりますか?

鍵となるのは、どのようなメカニズムを選択しても、変化に対して回復力があることを確認することです。第三者の視点に立って、自分のメソッドが期待どおりに機能するようにしてください。クラスを使用する開発者がメカニズムを深く理解する必要はありません。したがって、「loadPartial」パラメーターの代わりに、リストにバインドするために必要な高速で最小限のデータを解決し、必要に応じて他のフィールドを遅延ロードする別のメソッドを使用するだけです。

于 2009-08-11T20:45:45.380 に答える
1

Customer クラス自体のプロパティで遅延読み込みを使用しないのはなぜですか? 各プロパティ (Id、Name、Bio)、プライベート変数を指定します。各プロパティのゲッターで、プライベート変数が null でない場合はそれを返し、それ以外の場合は DAL から読み取ります。

Bio に関しては、遅延ロードする必要がある場合は、ゲッターで LazyLoadAdditionalDetails() という Customer クラスの別のメソッドを呼び出し、そこで適切な sproc を呼び出してから、プライベート変数を返します。

このようにして、コードを通常どおりに保つことができ、ページング ビューは ID と名前のゲッターのみを呼び出し、Bio は必要なときにのみ sproc から読み込まれます。レイジー ロード メソッドを呼び出すことを覚えておく必要はありません。

于 2009-08-11T20:54:32.320 に答える
1

それは受け入れられると思います...それはあなたのプログラムです。API が文書化され、他の人にとって意味のあるものであることを確認したいだけです。

補足として、ストアド プロシージャに 2 つのストアド プロシージャや従来の if ステートメントが必ずしも必要なわけではありません。

case ステートメントを使用NULLしてフィールドをいつでもアウトできますloadPartial == true

Case WHEN @loadPartial = 1 THEN NULL ELSE [bio] END
于 2009-08-11T20:47:29.073 に答える
1

メソッド名で明確にする限り、特定のケースに最適化された 2 つのメソッドを使用しても問題ないと思います。個人的にはそうは思いません:

Collection<Customer> FindAllCustomers(bool loadPartial);

非常に明確です。開発者は、ブール値のパラメーターが実際に何を意味するのかをどのように知ることができますか? ブール値のパラメーターを参照してください — においはありますか? 質問。

それを明確にして、すべてが順調です。

于 2009-08-11T20:49:34.530 に答える
0
class CustomerDAO
{
   private bool _LoadPartial = true;
   public bool LoadPartial
   {
      get
      {
         return _LoadPartial;
      }

      set
      {
         _LoadPartial = value;
      }
   }


   public Collection<Customer> FindAllCustomers()
   {
      ...
   }
}

私は安方のそれも好きですが、別の選択肢になるでしょう。

于 2009-08-11T20:55:18.887 に答える
0

それ以外の

Collection<Customer> FindAllCustomers(bool loadPartial);

私はそれを作るだろう

Collection<Customer> FindAllCustomers(bool includeBio);

「loadPartial」は、「部分的な」顧客を構成するものを消費者に伝えません。私も安方さんの意見に同感です。

于 2009-08-11T21:00:06.053 に答える