2011-03-17 3 views
3

안녕 나는 메서드를 수행하는 클래스 라이브러리를 가지고 있으며, 메서드 호출을위한 매개 변수로 사용하는 많은 다른 클래스를 가지고있다 ... 나는 wcf 래퍼를 만들고있다. 이 클래스 라이브러리. 클래스 라이브러리를 변경할 수있는 권한이 없습니다.Wcf datacontract 내가 수정할 수없는 라이브러리의 클래스에 대한

지금 내 질문은 어떻게 데이터 계약/datamembers 이러한 클래스를 쉽게 노출 할 수 있습니다 ..?

나는 이러한 방법에 필요한 약 100 개의 클래스를 가지고 있습니다.

감사

+0

[Serializable] 플래그가 지정되어 있습니까? –

답변

2

정말로 라이브러리를 변경할 수 없다면 WCF를 통해 클래스를 노출하는 유일한 방법은 각 메서드에 대한 래퍼 개체를 만드는 것입니다. 이 작업을 위해 코드 생성기를 작성해 보겠습니다.

필요한 메타 데이터 정보를 가져 오기 위해 노출 할 어셈블리의 유형 집합을 반사 할 수 있습니다.

t4 템플릿 (VS 2008 이상 버전)과 T4 Toolbox과 같은 것을 사용하여 코드 생성기를 만들어 코드를 작성할 수 있습니다. 생성기가 완료되면 라이브러리가 변경 될 경우 다시 생성해야합니다. 또한 코드 생성기를 업데이트하고 다시 실행하는 버그를 수정하는 것도 쉽습니다.

내가 완성도 만 언급했지만 문제가되는 다른 옵션은 문제의 코드를 분해하고 패치하는 것입니다. ildasm과 같은 것을 사용하여 어셈블리의 il을 덤프하고, 필요한 WCF 속성을 추가 한 다음 ilasm으로 다시 어셈블 할 수 있습니다. 그러나 프로세스가 오류가 발생하기 쉽습니다. 어셈블리를 변경하면 프로세스를 다시 실행해야하며, 어셈블리의 IP를 소유 한 사람에 따라 법적 문제가 발생할 수 있으며 어셈블리에 다시 서명해야합니다. 강력한 이름의 어셈블리 일 필요가있는 경우 잠재적으로 다른 암호화 인증서가 필요합니다.

* 편집 *

요청 래퍼 코드 샘플 :

public class ToWrap { 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

[DataContract] 
public class Wrapper { 
    private ToWrap _wrapped; 

    // constructor for WCF marshalling 
    public Wrapper() { 
    _wrapped = new ToWrap(); 
    } 

    public Wrapper(ToWrap wrapped) { 
    _wrapped = wrapped; 
    } 

    [DataMember] 
    public String Name { 
    get { return _wrapped.Name; } 
    set { _wrapped.Name = value; } 
    } 

    [DataMember] 
    public String Address { 
    get { return _wrapped.Address; } 
    set { _wrapped.Address = value; } 
    } 
} 
+0

안녕하세요 당신의 답장을 주셔서 감사합니다. 나는 그 클래스 주위에 래퍼를 만드는 것이 나를 위해 최선의 방법이라고 생각해. .. 두 속성의 작은 클래스에 대한 래퍼를 만드는 방법의 예를 들어 주 시겠어요 .. 전용 코드 .. 난 나중에 t4 템플릿을 살펴볼 것입니다.감사합니다 – Prakash

+0

@ 프라 카시 - 당신이 원하는 코드를 명확히 할 수 있습니까? 내가 제안한 것은 더 많은 코드를 작성할 코드를 작성한다는 것입니다. 래퍼 코드는 코드 생성기의 출력이며 매우 간단해야합니다. 타입 정보를 얻기위한 리플렉션 코드와 주어진 타입 입력 세트에 대한 래퍼 코드를 작성하는 생성기를 생성하는 데 필요한 모든 메타 데이터가 더 복잡 할 것입니다. 나는 그것을 쓰는 데 아마 3 일 (업무 일)을 계획 할 것입니다. –

+0

나는 래퍼 클래스가 어떻게 될지에 대한 작은 예제를 원할 것이다. 두 개의 public 속성을 가진 클래스가 있다고하자. 아마도 public class customer {public string name; public string address;} 그 래퍼가 어떻게 될까요? – Prakash

-2

나는 그것을 시도 적이 있지만,이 부분 클래스와 부분적인 방법을 사용하여 속성을 추가 시도 할 수 있습니다.

+2

-1 이것은 결코 작동하지 않습니다. 부분 클래스는 런타임이 아니라 컴파일러에 의해 구현됩니다. 컴파일시에 해결됩니다. 여기에는 라이브러리 수정이 포함됩니다. –

1

이러한 클래스는 다음과 같이 표시되는 경우 [직렬화] 당신은 여전히하는 WCF의 ServiceContract에서 사용할 수 있지만, 그들은 때로 믿을 수 있다면 ' 그런 다음 쉬운 방법이 없습니다. 동일한 프로퍼티를 가진 새로운 클래스를 생성 한 다음, 라이브러리 함수 중 하나를 호출 할 때마다 프로퍼티 - 바이 - 프로퍼티를 라이브러리의 해당 프로퍼티에 복사 할 수 밖에 없습니다.

1

.Net 3.5 SP1부터 더 이상 DataContract를 지정하지 않아도됩니다. ServiceContract 내에서 클래스를 사용하기 만하면됩니다.

자세한 내용은 DataContract를 사용할시기와 사용하지 않을시기에 대해 설명하는 this related question을 참조하십시오.