2

問題は、現在のコンテキストまたはシナリオに必要な追加データを使用してオブジェクトを拡張するための最良のアプローチは何かということです。

たとえば、ID、名前、価格などの基本的な (コア) プロパティを持つ Product クラスがあります。製品インスタンスは、主にビジネス レイヤー操作への入力/出力として使用され、他のアプリケーション レイヤー間で情報を運ぶためにも使用されます。

たとえば、GUI で製品を拡張情報 (製造元、製造元、計算値など) とともに一覧表示する必要がある場合、通常、一連の行を返す SP を作成し、この追加データを保存する必要があります。プロジェクト インスタンスで。これらの追加のプロパティのそれぞれで Product クラスを拡張したくありません (クラスは重くて洗練されておらず、主要な機能がありません)。また、Product をサブクラス化して新しいプロパティを追加したくありません (状況によっては複雑さが増します)。 .

私の考えは、さまざまなシナリオで使用される追加データを格納する 1 つ以上の複雑なプロパティ (オブジェクトをプロパティと共に格納する) を配置することですが、それが良い解決策かどうかはわかりません。

何を提案しますか?

4

4 に答える 4

2

モデルとビューモデルの問題が発生しているようです。ViewModel は表示目的でのみ有用であるため、追加のプロパティを持つビューモデルを持ち、モデルを UI レベルでビューモデルにマップすることは有効な設計です。

于 2012-06-07T20:37:46.567 に答える
1

2つのクラスを作成することを検討してください。1つは、と呼ばれProductSummary、一部の製品データの読み取り専用表現が含まれます。

public class ProductSummary
{
    public int Id { get; }
    public string Name { get; }
    public double Price { get; }
}

と呼ばれる2番目のクラスにはProductDetail、すべての製品データの読み取り/書き込みプレゼンテーションが含まれます。

public class ProductDetail
{
    public int Id { get; }
    public string Name { get; set; }
    public double Price { get; set; }
    public string Manufacturer { get; set; }

    private ProductDetail()
    {
    }

    public double ComputeValue()
    {
    }

    public static ProductDetail(ProductSummary summary)
    {
        var newProduct = new ProductDetail();
        // load Product data using primary key from summary.Id      
        // populate newProduct from loaded data
        return newProduct;
    }
}

このProuctSummaryクラスは、重要な製品情報の軽量で読み取り専用のコンテナーであることがわかりました。データのコレクションをProductSummary使用して、リストなどにデータを入力できます。

製品を編集する必要がある場合は、オブジェクトのIDを使用して、シナリオの編集に使用できるより重いクラスProductSummaryをロードできます。ProductDetail

これは冗長な作業のように見えるかもしれませんが、クラスは特定のユースケース向けに設計する必要があることを考慮してください。軽量の読み取り専用サマリークラスを使用し、編集可能なクラスを個別に使用する場合は、2つの個別のクラスを検討することをお勧めします。

于 2012-06-07T20:51:06.343 に答える
0

だから...私がこの正しさを理解しているなら:

  • 製品クラスを「Product」を継承するサブクラスに拡張したくない
  • すべての余分な「状況」プロパティをProductクラス自体に追加する必要はありません。

これを考えると、あなたが探しているのは、状況に応じてオブジェクトに一時的なプロパティを追加する方法ですか?

「カスタムプロパティ」には、標準の単純なHashTable拡張機能をお勧めします。

private HashTable CustomProperties { get; set; }

//Note: all three of these functions are unecessary if you make the hashtable public, but they do look good as far as an interface goes.
public void AddCustomProperty (String key, Object value)
{
    CustomProperties.Add(key, value);
}

public void RemoveCustomProperty (String key)
{
    CustomProperties.Remove(key);
}

public object GetCustomProperty (String key)
{
    return CustomProperties[key];
}

これにより、必要なプロパティをKeyValueペアとしてProductsオブジェクトに直接保存できます。これで、直接データバインディングを使用できなくなったため、それらを表示することがさらに面白くなります...編集と同じです。しかし、ボックスとラベルを直接設定するのは簡単です。

代替ソリューション-ランタイムタイプ

実際には存在しないが、そのように使用できるカスタム型を宣言します。

var ExtProduct = new {
    MyCustomProp = "whatever I want",
    ProductBase = productInstace };

必要に応じて拡張します。

リストを使ってこれを行うこともできます

var ExtProductList = from a in ProductList select new {
    MyCustomProp = "Whatever I want",
    ProductBase = a };

これは非常に一時的なものであり、値を他のものに渡す場合にはほとんど役に立ちませんが、結合リストからのカスタム計算や一時的な値のUI表示には大規模なユーティリティがあります。カスタム値を編集可能にする必要がある場合は、キャプチャするのが少し難しくなりますが、それほど重要ではありません。

于 2012-06-07T20:48:43.953 に答える
0

私は個人的にクラスを拡張しますが、次のようなこともできます。

public class Product
{
    ...

    public List<ProductProperty> AdditionalProperties { get; set; }
}

class ProductProperty
{
    public string Name { get; set; }
    public object Data { get; set; }
}

絶対にベストプラクティスではないことに注意してください;)

于 2012-06-07T20:40:02.757 に答える