2013-03-15 25 views
1

我正在註冊特定的消息,當收到呼叫特定的事件。BrokeredMessage發送/解析消息序列化POCOs

我看到BrokeredMessage接受一個對象,我知道我需要爲所有消息實現ISerializable。

Hpwever,我的消息是純POCO對象,我想探索使用它們的可能性,-是:

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

在接收過程中我會:

  1. 檢索消息和返回以對象類型
  2. 查找我的地圖,致電註冊此事件消息的活動

雖然描述起來很簡單,但第一步拉出我的頭髮。

是否有任何框架,這將包裝我在Azure總線?

如果使用IoC,理想情況下我希望能夠使用我最喜歡的噴油器SimpleInjector - 如果直接定義適配器,這不會成爲問題。

回答

3

在某些時候,你必須有一個類DataContract,DataMember等,其屬性發送到DataContactSerializer。但是,您不必將它們添加到您的POCO中。

一種方法是簡單地創建一個DTO,並使用與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來告訴調用者它支持CustomerOrderEvent並且在序列化時使用CustomerOrderEventSurrrogate。它還執行GetObjectToSerializeGetDeserializeObject以從替代品到POCO來回映射。

現在,您只需創建一個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。)