0

フィードからデータを取得した後に入力するデータ オブジェクトがたくさんあります。フィードは信頼性が低く、データがドロップされることがあります。受信データを既に持っているデータとマージする必要があります。そのための簡単に拡張可能でスケーラブルなパターンを見つけることができません。

たとえば、私のデータモデルには次のフィールドがあります

DataModelExample
{
    public string Name;
    public string Value;
    public string Extension;
}

フィードがフィールド Value を削除した場合、キャッシュから既存のデータ オブジェクトからデータを選択して 2 つをマージしても問題ありません。これを行う必要があるさまざまな数のフィールドを持つ多数のデータ オブジェクトがあります。

何か案は?

4

2 に答える 2

3

1 つの可能な方法:

すべてのプロパティ定義を変更して、それらがすべてになるようにすることができますnullable

たとえば、public int MyInt { get; set; }プロパティがある場合は、次のように変更しますpublic int? MyInt { get; set; }

次に、オブジェクトがフィードから取り込まれた後、リフレクションを使用してすべてのプロパティを反復処理し (「クラスのすべてのプロパティをループする方法」を参照)、値が null の場合は各プロパティに対して反復処理を行うことができます (つまり、フィードプロパティをドロップします)、キャッシュから取得した値を設定します。

于 2012-08-02T15:07:48.860 に答える
0

@ ken2kが提案したリフレクションの代わりに、オブジェクトを処理し、必要に応じてキャッシュからデータをマージするクラスのグループを作成できます。必要なそのようなクラスの数を最小限に抑えるために、データ オブジェクトが実装するインターフェイスで動作するようにします。

public interface IDataModelExample
{
    string Name { get; set; }
    string Value { get; set; }
    string Extension { get; set; }
}

public class DataModelExampleMerger
{
    public IDataModelExample Merge(IDataModelExample dme)
    {
        var cachedDme = LoadFromCache(); // This would require the key of course.
                                         // I'll leave the implementation up to 
                                         // you.

        if (string.IsNullOrEmpty(dme.Name))
        {
            dme.Name = cachedDme.Name;
        }

        // Repeat similar if-block for all properties.

        return dme;
    }
}

データ オブジェクト インターフェイスごとに 1 つの合併クラスを作成する必要があるため、このソリューションはリフレクション ベースのソリューションよりもかなり多くのコードを必要とします。あなたは仕事を回避できないと思います。これはトレードオフです。ランタイム パフォーマンスと全体的なコーディング時間です。正直なところ、ユーザーが文句を言い始めない限り、実行時のパフォーマンス ヒットを受け入れますが、それはあなた次第です。

時期尚早の最適化は諸悪の根源であることを忘れないでください。

于 2012-08-02T15:31:20.680 に答える