1

私は中規模のシステムを構築していますが、おそらく以前に直面したことがある問題に直面しています。私のビジネスレイヤーでは、そのビジネスメソッドにとって重要なプロパティのサブセットを持つビジネスオブジェクトを返します。意味のない名前のオブジェクトが多数あるか、特定のプロパティのサブセットのみが入力されているオブジェクトだけになる可能性があるため、心配しています。方法。例を挙げましょう。

ケース1

たとえば、ユーザーは都市に属しており、都市は州と国に属しており、、、Userはデータベース上の多くのフィールドを持つテーブルですが、注文のリストを含むユーザーのリストが必要なので、たとえば、重要なプロパティ()のみを使用して呼び出されるビジネスオブジェクトを作成すると、DALはデータベースからそのフィールドのみを取得します。CityStateCountryUserWithOthersUserId, UserName, CityName, StateName, CountryName, List<Order>

ケース2

注文数のあるユーザーを返したいのですが、ビジネスオブジェクト(UserId, UserName, CityName, StateName, CountryName, OrdersCount)の次のフィールドで終わります。たとえば、クラスを呼び出すことができます。UserWithOrderCount

私はいくつかのオプションで考えました:

  1. 2つのビジネスクラスを作成し、各DALメソッドに個別に入力します(このオブジェクトは単純ですが、再利用のためにカプセル化する必要がある複雑なselectクエリがメソッドに含まれる可能性があるため、リポジトリパターンがここにうまく適合しないことを考慮してください。少なくとも私は)。
  2. Userすべてのプロパティ()を使用して1つのオブジェクトのみを作成UserId, UserName, CityName, StateName, CountryName, OrdersCount, List<Order>し、各DALメソッドのサブセットのみを入力します。ただし、データベースから入力されるフィールドのサブセットを知る必要があり、セマンティックカップリングが最悪であるため、メソッドを使用する場合はセマンティックカップリングを意味します。すべてのカップリングの。
  3. List<Order>オプション1は、後で別のビュー、およびOrdersCountプロパティの両方で必要になった場合、うまく処理されません。
  4. ASP.NET MVCを使用する場合、ビューに渡すにはViewModelが必要であるとのグッドプラクティスがあり、BusinnesレイヤーからViewModelを返すことを考えましたが、それは良い考えではないと思います。何かに違反しているだけでなく、私のビジネスレイヤーがWebアプリケーションではなく別のアセンブリにあるため、不可能です。
  5. 同じLinqクエリを何度も書きたくないのですが、NHibernateまたはEFCodeFirstを使用する場合は、オプション1に「いいね」があり、大量のスモールビジネスオブジェクトを作成する必要があります。

この状況にどのように対処しますか?これは高レベルの設計上の決定だと思います。

4

1 に答える 1

2

まず第一に、私はあなたがしていないいくつかのことについてあなたに間違いなく同意します:

  1. ビジネスオブジェクトに部分的にデータを入力しないでください。ビジネスレイヤーのクライアントにどのプロパティが入力されているかを知る責任がありますが、これは非常に悪い習慣です。

  2. ビジネスレイヤーからViewModelsを返さないでください。ビジネスレイヤーは、アプリケーションのドメインのビジネスコンセプトを表すことになっています。また、ViewModelは、そのドメインの一部の特定のビューを表示するために必要なデータを含むデータオブジェクトです。この2つは非常に異なるものであり、ビジネスレイヤーはそのビジネスオブジェクトがあらゆる種類のGUIで使用されていることに完全に気付かないでください。

私はあなたの最初の提案に行きます-それぞれのビジネスコンセプトを表すために1つの別々のビジネスオブジェクトを作成します。次に、ORM(EFやNHibernateなど)を使用して、オブジェクトのグループごとに専用のリポジトリを使用して、これらのオブジェクトにデータを入力します。次に、リポジトリを呼び出すアプリケーション層を使用して、必要なオブジェクトを返します。この目的のために、リポジトリには、これら2つのタイプを一緒に使用する必要があることがわかっている場合に、結合されたユーザーと注文を返すメソッドを含めることができます。これにより、ユーザーと注文を表す個別の意味のあるエンティティを保持しながら、1つのクエリですべての注文を含むユーザーを返すことができます。

于 2011-06-02T15:09:27.227 に答える