2016-05-18 9 views
1

シナリオは次のとおりです。多くの変数、数百を含むメッセージを受け取ります。私はこれをAzure Tableストレージに書き込む必要があります。このストレージでは、パーティションキーが個々の変数の名前であり、値は、値。AutoMapper:多くのプロパティを1つにマッピングする

のは、ペイロードは、次のようになりましょう:

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回コピーしたくありません(またはペイロードmに何個の変数があるかエッセージ;これは固定数です)。

私はテーブルを作成する方法を作ることができましたが、私はまだこれを900回呼び出さなければなりません。

私はおそらくAutoMapperが助けになると考えました。

+0

追加情報ペイロードには常にすべてのプロパティが含まれます。 TableのSignalプロパティの値は、Valueに "put"するプロパティの名前である必要があります。たとえば、payload.Fooがtable.Valueにマップされている場合、table.Signalは「Foo」でなければなりません。 –

答えて

0

いつも同じ変数ですか?別のアプローチは、あなたは基本的にあなたがのrowKey /のPartitionKeyデュオの後に、すべての追加のフィールドを記入することができTableEntityを持っているDynamicTableEntityを使用することができます

var tableEntity = new DynamicTableEntity(); 
tableEntity.PartitionKey = "partitionkey"; 
tableEntity.RowKey = "rowkey"; 

dynamic json = JsonConvert.DeserializeObject("{bunch:'of',stuff:'here'}"); 
foreach(var item in json) 
{ 
    tableEntity.Properties.Add(item.displayName, item.value); 
} 
// Save etc 
0

問題は、それが正しいと、これらのプロパティをマップするのですか?

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

この条件マッピングは、リフレクションを介して行うことができます。

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.MapAutoMapper.Mapper.DynamicMap呼び出しで(送信元と送信先に同じ名前を持つ)残りのプロパティをマッピングすることができます。または、​​をdynamicにキャストし、手動でマップします。

+0

はい、あなたは正解ではないと申し訳ありません。値は、ソースからのいくつかの変数/プロパティの1つにマップする必要があります。したがって、ペイロードでRpmが1の場合、表の値は1になります。信号は、プロパティの対応する名前にマッピングする必要があります。したがって、Signal = "Rpm"です。私はこれを試してみる。ありがとうございました。 –

関連する問題