2011-11-21 3 views
0

DTO 개체가있는 WCF Ria Services App이 있습니다. 내 DTO 객체 사이의 관계를 정의했습니다.개체를 도메인 메서드에 전달할 때의 문제

[Include] 
    [Association("FK_Items_OrderID", "ID", "OrderID")] 
    public List<Item> Items { get; set; } 

그래서 클라이언트의 항목 모음을보고 조작 할 수 있습니다. 그런 다음 변경 사항을 저장하고이 메소드를 호출하려고합니다.

[Invoke] 
    public void SaveOrderChanges(Order order) 
    { 
     _dataManager.SaveOrderChanges(order); 
    } 

도메인 서비스 방법입니다. 하지만 여기에 주문 항목에 관련된 항목의 컬렉션은 이미 NULL이지만,이 메서드를 클라이언트에서 호출하고이 메서드 모음에 대한 순서를 채우면 채워집니다.

아무도 모르는가요? 감사.

답변

1

클라이언트 측 시리얼 라이저에 연결이 포함되어 있지 않기 때문에 발생합니다. Wcf ria 서비스는 이러한 종류의 장면을 처리하는 다른 방법을 가지고 있지만이 방법은 DomainContext와 표준 Get/Insert/Update/Delete 메서드를 사용합니다. 내 조언은

[Invoke] 
public void SaveOrderChanges(string serializedOrder) 
{ 
    Order order = MyCustomSerializer.Deserialize<Order>(serializedOrder); 
    _dataManager.SaveOrderChanges(order); 
} 

Thi`s처럼 뭔가에 저장 방법의 부호를 변경하는 것입니다, 그러나 Items 컬렉션을 포함하는 속임수해야 내가 직렬화와 개체를 역 직렬화하는 데 사용 유틸리티 클래스입니다.

public static class Serialization 
{ 
    public static string Serialize<T>(T obj) 
    { 
     //Create a stream to serialize the object to. 
     var ms = new MemoryStream(); 

     // Serializer the User object to the stream. 
     var ser = new DataContractSerializer(typeof (T)); 


     ser.WriteObject(ms, obj); 
     byte[] array = ms.ToArray(); 
     ms.Close(); 
     return Encoding.UTF8.GetString(array, 0, array.Length); 
    } 

    public static T Deserialize<T>(string obj) where T : class 
    { 
     if (obj == null) 
      return null; 
     var serializer = new DataContractSerializer(typeof (T)); 
     var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)); 
     var result = serializer.ReadObject(stream) as T; 
     return result; 
    } 
} 

물론 반대쪽 클라이언트 쪽에서 주문 및 항목을 serialize해야합니다. 이것이 내가 알기에 가장 쉬운 방법이지만, here도 볼 수 있습니다. 결국, WCF 리아가 (컨텍스트 기반)으로 이동하기위한 것입니다 방법으로 코드를 리팩토링하는 노력이 도움이

희망,
마르코

관련 문제