7

私は古いパズルを持っているので、それをあなたと共有しようと思いました、正しい方向に進むかもしれません。つまり、データベース内のエンティティの一部は非常に大きく(読み取りには多くのプロパティがあります)、ビジネスロジックがすべてのエンティティプロパティを使用することはめったにないため、ビジネスロジックが正しく機能するには、どのプロパティをロードする必要があるかを考える必要があります。非常に架空のサンプル:

public class Product 
{
    public string Title {get;set;}
    public string Description {get;set;}

    public string RetailPrice {get;set;}
    public string SupplierId {get;set;}

    public Supplier Supplier { get;set;}

    // many other properties
}

public class ProductDiscountService
{
    public decimal Get(Product product)
    {
        // use only RetailPrice and Supplier code
        return discount;
    }
}

public class ProductDescriptionService 
{
    public string GetSearchResultHtml(Product product) 
    {
        // use only Title and Description
        return html;
    }
}

インターフェイスIDiscountProductとISearchResultProductを抽出し、それらのインターフェイスを実装するものとして製品をマークしてから、これらの各インターフェイスを実装する小さなDTOを作成できるようですが、現時点ではやり過ぎと見なされます(少なくとも、インターフェイスを使用してプロパティをグループ化する人は誰もいません) 。

データベース内のエンティティをより小さなエンティティに分割することも合理的ではありません。これらのプロパティはすべて製品に属しているため、何かを選択するために多くの結合を使用する必要があり、一部のプロパティがに属すると判断した場合は別のエンティティ、その動きは実装するのが非常に難しいでしょう。

すべてのプロパティを特定のメソッドのビジネスロジックでメソッドパラメータとして使用することも、悪い解決策のように見えます。

4

1 に答える 1

1

プロパティが大きくない限り (長い文字列やバイナリを読み取る)、すべてをロードします。

以下のポイントは、単純なプロパティ (例: タイトル) の場合です。

  1. 余分なコードはありません (タイトルのみでこの製品を入手するか、価格のみで入手してください)
  2. 製品インスタンスは常に完全であるため、プロパティが null かどうかを確認せずに渡すことができます。
  3. 他のいくつかのプロパティを遅延ロードする必要がある場合は、熱心にロードするよりもコストがかかります。20 個のプロパティがある場合、これは大きなオブジェクトではありません ((仮の) Description プロパティのサイズがキロバイトでない場合)。

ここで、関連するオブジェクト (ProductSupplier) がある場合、このプロパティが使用されることがわかっていない限り、これは遅延ロードする必要があります。

于 2012-06-05T16:28:24.140 に答える