1

受信したときに特定のイベントを呼び出す特定のメッセージを登録しています。

BrokeredMessageがオブジェクトを受け入れることがわかります。これは、すべてのメッセージにISerializableを実装する必要があることを理解しています。

ただし、私のメッセージはプレーンPOCOオブジェクトであり、そのまま使用する可能性を探りたいと思います。

public class CustomerOrderEvent
{
   int orderId;
   int quantity;
   double value;
}

受信中に私は:

  1. メッセージを取得してオブジェクトタイプに戻る
  2. マップを検索し、このイベントメッセージに登録されているイベントを呼び出します

説明は簡単ですが、最初のステップで髪を引き出します。

Azureバス上でこれをラップするフレームワークはありますか?

IoCを使用する場合、理想的には、お気に入りのインジェクターSimpleInjectorを使用できるようにしたいです。アダプターを定義するのが簡単であれば、これは問題になりません。

4

1 に答える 1

3

DataContractある時点で、に送信するために、、DataMemberなどの属性を持つクラスが必要になりますDataContactSerializer。ただし、それらをPOCOに追加する必要はありません。

1つのオプションは、POCOと同じデータを入力するDTOを作成することです。このDTOは、でラップしますBrokeredMessage。または、POCOを何らかの方法でシリアル化して、Streamに与えることもできます。BrokeredMessage

別の方法は、.NETシリアル化で「サロゲート」と呼ばれるものを使用することです(DTOとほぼ同じです)。これには、サロゲートを定義するだけでなく、IDataContractSurrogateを手動で作成するときに使用する実装も定義する必要がありますDataContractSerializer

まず、あなたが実際に持っているのは、あなたが投稿したプライベートフィールドを持つPOCOではなく、パブリックプロパティを持つPOCOであると仮定します。これで、サロゲートを作成できます。

[DataContract(Name = "CustomerOrderEvent", Namespace = "http://www.mynamespace.com")]
public class CustomerOrderEventSurrogate
{
    [DataMember]
    public int OrderId { get; set; }

    [DataMember]
    public int Quantity { get; set; }

    [DataMember]
    public double Value { get; set; }
}

...簡単です。この例では、必要なすべての属性を備えたPOCOと同じです。次に、IDataContractSurrogate実装を定義します。

public class DataContractSurrogate : IDataContractSurrogate
{
    public Type GetDataContractType(Type type)
    {
        if (typeof (CustomerOrderEvent).IsAssignableFrom(type))
        {
            return typeof (CustomerOrderEventSurrogate);
        }
        return type;
    }

    public object GetObjectToSerialize(object obj, Type targetType)
    {
        var customerOrderEvent = obj as CustomerOrderEvent;
        if (customerOrderEvent == null) return obj;

        var surrogate =
            new CustomerOrderEventSurrogate
                {
                    OrderId = customerOrderEvent.OrderId,
                    Quantity = customerOrderEvent.Quantity,
                    Value = customerOrderEvent.Value
                };
        return surrogate;
    }

    public object GetDeserializedObject(object obj, Type targetType)
    {
        var surrogate = obj as CustomerOrderEventSurrogate;
        if (surrogate == null) return obj;

        var customerOrderEvent =
            new CustomerOrderEvent()
                {
                    OrderId = surrogate.OrderId,
                    Quantity = surrogate.Quantity,
                    Value = surrogate.Value
                };
        return customerOrderEvent;
    }

    public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
    {
        throw new NotImplementedException();
    }

    public object GetCustomDataToExport(Type clrType, Type dataContractType)
    {
        throw new NotImplementedException();
    }

    public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
    {
        throw new NotImplementedException();
    }

    public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
    {
        throw new NotImplementedException();
    }

    public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
    {
        throw new NotImplementedException();
    }
}

ここではNotImplementedException、オプションのメソッドをスローします。この実装は、シリアル化時にサポートし、代わりに使用するGetDataContractTypeことを呼び出し元に通知するために実装されます。また、サロゲートからPOCOへの実装とマッピングも行います。CustomerOrderEventCustomerOrderEventSurrrogateGetObjectToSerializeGetDeserializeObject

ここで、使用する実装を認識BrokeredMessageしているDataContractSerializerインスタンスを使用してを作成するだけです。IDataContractSurrogate例えば:

var customerOrderEvent = new CustomerOrderEvent
                                {
                                    OrderId = 1,
                                    Quantity = 1,
                                    Value = 1.99
                                };

var dataContractSerializer =
    new DataContractSerializer(typeof (CustomerOrderEvent),
                                new[] {typeof (CustomerOrderEvent)},
                                int.MaxValue,
                                true,
                                true,
                                new DataContractSurrogate());

var message = new BrokeredMessage(customerOrderEvent, dataContractSerializer);

また、メッセージを受信したら、DataContractSerializerオブジェクトをGetBodyメソッドに渡すことができます。例えば:

message.GetBody<CustomerOrderEvent>(dataContractSerializer);

...これは、会話のこちら側が他の側とすべて同じことを行っていることを前提としています(代理クラス、IDataContractSurrogate実装を持ち、dataContractSerializer適切に作成されています)。

于 2013-03-16T17:21:10.150 に答える