1

シナリオは次のとおりです。多数の変数 (数百) を含むメッセージを受け取りました。これを Azure テーブル ストレージに書き込む必要があります。パーティション キーは個々の変数の名前であり、値はたとえば Value にマップされます。

ペイロードが次のようになっているとします。

public class Payload
{
    public long DeviceId { get; set; }
    public string Name { get; set; }
    public double Foo { get; set; }
    public double Rpm { get; set; }
    public double Temp { get; set; }
    public string Status { get; set; }
    public DateTime Timestamp { get; set; }
}

そして、私のTableEntryは次のようになります:

public class Table : TableEntity
{
    public Table(string partitionKey, string rowKey)
    {
        this.PartitionKey = partitionKey;
        this.RowKey = rowKey;
    }

    public Table() {}
    public long DeviceId { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
    public string Signal { get; set; }
    public string Status { get; set; }
}

それをテーブル ストレージに書き込むには、次のことを行う必要があります。

var table = new Table(primaryKey, payload.Timestamp.ToString(TimestampFormat))
{
    DeviceId = payload.DeviceId,
    Name = payload.Name,
    Status = payload.Status,
    Value = value (payload.Foo or payload.Rpm or payload.Temp),
    Signal = primarykey/Name of variable ("foo" or "rmp" or "temp"),
    Timestamp = payload.Timestamp
};
var insertOperation = TableOperation.Insert(table);
await this.cloudTable.ExecuteAsync(insertOperation);

これを 900 回コピーしたくありません (または、ペイロード メッセージに含まれる変数の数。これは固定数です)。

テーブルを作成するメソッドを作成することもできますが、これを 900 回呼び出す必要があります。

AutoMapper が役立つかもしれないと思いました。

4

3 に答える 3

0

問題は、これらのプロパティをマップすることですよね?

Value = value (payload.Foo or payload.Rpm or payload.Temp),
Signal = primarykey/Name of variable ("foo" or "rmp" or "temp"),

この条件付きマッピングは、Reflection を介して行うことができます。

object payload = new A { Id = 1 };
object value = TryGetPropertyValue(payload, "Id", "Name"); //returns 1

payload = new B { Name = "foo" };
value = TryGetPropertyValue(payload, "Id", "Name"); //returns "foo"

.

public object TryGetPropertyValue(object obj,  params string[] propertyNames)
{
    foreach (var name in propertyNames)
    {
        PropertyInfo propertyInfo = obj.GetType().GetProperty(name);

        if (propertyInfo != null) return propertyInfo.GetValue(obj);
    }

    throw new ArgumentException();
}

何百もの構成マップの作成を回避する代わりに、残りのプロパティ (ソースと宛先で同じ名前を持つ) をAutoMapper.Mapper.DynamicMap呼び出しでマップすることができます。AutoMapper.Mapper.Mapまたは、にキャストpayloaddynamicて手動でマップするだけです。

于 2016-05-18T12:08:20.070 に答える