2014-10-09 3 views
0

내 요구 사항은 데이터베이스에 선행/후행 공백이 저장되지 않도록하는 일반적인 방법입니다. 우리의 아키텍처는 WCF-> 비즈니스 로직 Managers-> 일반 Repository-> 엔티티 프레임 워크 5.0 -> DBWCF 서비스에서 역 직렬화시 공간 잘라 내기

지금 나는 그것을 할 수있는 2 가지 방법이 있습니다

  1. 일반 저장소에서 그것을 할 (그러나 여기에서 나는 것 문자열 속성에 대한 전체 개체 그래프를 검색하고 값을 변경해야합니다.)
  2. WCF 파이프 라인에서 비 직렬화 할 때 수행합니다 (그러나 여기에서는 모든 사용자 지정 serializer를 넣어야 할 수도 있습니다. 내가 원하는 속성 유형을 쿼리하고 값을 변경할 수있는 직렬화 중 이벤트가 필요합니다.

접근 방식 2를 선호하지만 전체 직렬 변환기를 변경하지 않고이 작업을 수행하는 가장 쉬운 방법을 찾고 있습니다. 거기에 사용자 지정 serializer를 사용하지 않고 변경할 수있는 방법이 있나요. 우리는 현재 XmlSerializer를 사용하고 있습니다.

입력을 다음 찾고 (2) 나는 WCF 파이프 라인에서 직렬화 프로세스를 기존의 내 작은 방법을 첨부 할 수 있습니다 어떻게 성능

  • 더 나은 것 접근

    1. .

    덕분에, 아비

  • +0

    수준이 귀하의 요구 사항이 무엇인지에 "내 요구 사항은 더 선도/후행 공백이 데이터베이스에 저장되지 않도록하는 일반적인 방법을 넣어하는 것입니다" ? 운송 요구 사항입니까? – Aron

    +0

    지속성 요구 사항이며 메시지가 이미 마지막 계층에 도달 했으므로 지속성이 필요합니다. XML을 deserialize 할 때 쿼리 유형 및 해당 값을 다시 반영 할 필요가없는 시점에서이 문제를 해결하고 싶습니다. – asolvent

    +1

    그것은 수사학적인 질문이었습니다. 나는 내 질문에 대한 답을 알고있다. 나의 요점은 "최소한의 놀라움의 원리"입니다. 반사에 대한 귀하의 우려에 관해서. ORM에 이미 엔티티 유형에 대한 메타 데이터가 있습니다 (모든 특성에 대해 알고 있으며 그 중 어떤 것이 문자열인지 알고 있습니다). 요구 사항을 구현하는 코드가 실제 레이어에서 오는 것이므로 ... "놀람"이 더 많을수록 중간 코드가 더 복잡해질 수 있습니다. – Aron

    답변

    0

    코드는 요구 사항이 발생한 위치 즉 주어진, 데이터 레이어가 아닌 직렬화 층에 작동합니다.

    구현에는 두 가지 옵션이 있습니다.

    DbChangeTracker을 사용하거나 IDbCommandInterceptor (EF6의 새로운 기능)을 사용하여 EF 컨텍스트의 동작을 변경할 수 있습니다. 다음은

    쉽게 변경 추적이 할 수있는 방법입니다

    public class FooContext : DbContext 
    { 
        public override int SaveChanges() 
        { 
         var items = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
         foreach(var item in items) 
         foreach(var property in item.PropertyNames) 
         { 
          var propValue = item[property] as string; 
          if(propValue != null) 
          { 
           item[property] = propValue.Trim(); 
          } 
         } 
         return base.SaveChanges(); 
        } 
    }