2011-10-10 5 views
1

기술적 인 질문만큼이나 설계되었습니다. 나는이 권리를하고 있는지 잘 모르겠다. ...WCF가 사용자 지정 개체를 클라이언트에 전달하고 해당 메서드를 실행합니다.

DB와 통신하고 별도의 .dll에 정의 된 Person 개체를 다시 전달하는 WCF API가 있습니다. 이것은 메서드와 특성을 모두 가지고 있습니다. 개체가 WCF에서 호출 클라이언트로 전송됩니다.

클라이언트의 Person 메소드를 호출하고 싶습니다. 나는 API에서 다운 스트림으로 보낼 수 없다는 것을 이해하지만 WCF가 사용하는 .dll을 참조 할 경우 .dll Person으로 API Person을 캐스팅 할 수 있어야한다.

내가 달성하고자하는 것이 분명하기를 바랍니다. 데이터 contracts.These 그것이 proerties을의와 데이터 모델이 obejct 사람처럼, 반환 할 수 있습니다 통해

덕분에, 샘

답변

1

WCF는 이미 프로젝트에 포함 된 참조를 다시 사용할 수있는 기능을 지원합니다. 이러한 의미에서 계약 어셈블리 (자신의 논리를 추가 할 수있는 얇은 도메인 모델 (예 : Person 등)을 포함하는 어셈블리)을 만들 수 있습니다.

그런 다음 어셈블리를 WCF 서비스와 클라이언트 프로젝트를 호출하고 기존 참조를 다시 사용하도록 WCF에 지시합니다. 이렇게하면 서비스에서 가져온 것은 Person 로컬 복사본으로 deserialised되지만 프록시로 생성되는 Person은 생성되지 않습니다. 이 메서드 호출을 수행 할 수있는 인스턴스입니다.

Person 인스턴스에 변경 한 사항은 클라이언트에만 국한되므로 사용자가이 메서드를 호출하면 값을 기준으로 마샬링됩니다. WCF 서비스에 다시 업스트림으로 전달하여 (직렬화를 통해) 서비스가 변경 사항을 인식하고 그에 따라 작동하도록합니다.

+0

더 좋은 방법이 있나요? 서버 및 클라이언트 모두에서 Person 객체를 만들 수 있습니까? 나는이 방법으로 하나의 Person 객체와 서비스와 클라이언트간에 공유 할 수있는 몇 가지 객체를 생성하면된다고 생각했습니다. 나는 내가 연구하고있는 개인 프로젝트 인 가장 우아한 솔루션을 찾고있다. – sam

+0

나는 그 요점을 놓치고 있다고 생각합니다. 한 번만'Person'을 구현합니다. 공유 어셈블리 (계약 어셈블리). 그런 다음이를 서비스 및 클라이언트에서 참조합니다. –

+0

아니요, 15 분 전에는 해결 방법이 있습니다. 감사! 그러나 공유 어셈블리에서이 작업을 수행하는 가장 좋은 방법입니까? 나는 WCF가 처음이다. 그걸로 어떤 문제를 예측합니까? – sam

2

WCF 작동합니다. 서비스에서 클라이언트로 객체를 전송하는 동안 메소드가 걱정되지 않습니다. 따라서 dll에서 데이터 계약을 사용하고 WCF를 참조하면 프록시 클래스가이 dll에서 Person 객체를 생성합니다.

당신의 논리가 더 복잡한 경우 나는 당신이 가지고있는 상황에 달려 있다고 생각합니다. 나에게 몇 마디로 설명하자

  1. 당신은 DLL의 소스를 변경하고 DLL의 public 메서드를 호출 할 수없는 경우, 반사를 사용하는 것이 좋습니다. 그래서 WCF에서 객체를 받고, 반환 된 값으로 Person 속성을 설정하고, method를 호출합니다.

  2. dll 소스를 변경할 수 있으면 기본 인터페이스 (예 : IPerson)를 작성하고 dll에서 Person 객체의 속성으로이 인터페이스를 구현 한 다음 IPerson 객체를 반환 할 수 있습니다. 이 경우 캐스트를 수행 할 수 있습니다.

자세한 내용 : 좋아, 좀 더 자세한 내용을 제공 할 수 있도록 :

  1. 을 내가 인터페이스를 별도의 DLL을 만들 수 권하고 것이다 둥지 연습으로. 이 개체는 개체를 설명하는 데이터 계약 인터페이스 여야합니다. 다음과 같은 것 :

    [DataContract] 
    public interface IPerson 
    { 
        [DataMember] 
        public int Identifier { get; set; } 
    
        [DataMember] 
        public string First { get; set; } 
    
        [DataMember] 
        public string Last { get; set; } 
    
        public string GetSomething(); 
    } 
    
  2. 구현중인 WCF의 메소드는 IPerson 유형을 반환해야합니다.

  3. 공유 DLL에서 개체 Person에 대한 인터페이스 IPerson을 구현하십시오.
  4. WCF 및 클라이언트에서이 DLL에 대한 참조.
  5. 클라이언트 용 웹 참조를 WCF 서비스에 추가하십시오.
  6. 메소드는 IPerson 유형의 객체를 반환하므로 공유 라이브러리의 Person 객체를 사용할 수 있으며 모든 메소드를 사용할 수 있습니다.
+0

빠른 답장을 보내 주셔서 감사합니다. 외부 DLL이 원본이므로 수정할 수 있습니다. 옵션 2에 대해 조금 더 설명해 주시겠습니까? 개념이 마음에 들지만 완전히 이해하지 못합니다. – sam

+0

@sam 추가 정보가있는 게시물이 업데이트되었습니다. – dimko1

+0

데이터 계약 인터페이스가 포함 된 dll과 해당 인터페이스 구현이 포함 된 공유 dll이 있습니까? 그리고 나는 클라이언트 프로젝트뿐만 아니라 WCF Service 프로젝트의 dll을 모두 참조해야합니까? 그렇다면 별도의 인터페이스 DLL을 구현하는 용도는 무엇입니까? – comecme

1

동일한 dll을 참조하고 있으며 WCF를 강력한 형식으로 지정할 수 있으므로 캐스팅하지 않고 Person 응답 개체에서 메서드를 호출 할 수 있어야합니다. DataContract 특성을 사용하는 Person 클래스를 정의 할 때 반드시 확인하십시오.

다음 예제에서는 Person 클래스가 서버 측의 세 가지 데이터 멤버와 함께 WCF에 의해 serialize됩니다. 클라이언트 측 WCF는 Person 클래스를 생성하여 응답을 deserialize합니다. 따라서 클라이언트 측에서 FullName()을 호출하면 캐스팅하지 않고도 작동합니다.

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public int Identifier { get; set; } 
    [DataMember] 
    public string First { get; set; } 
    [DataMember] 
    public string Last { get; set; } 
    public string FullName() 
    { 
     return First + " " + Last; 
    } 
} 
+0

내 개체가 어떻게 보이는지, 클라이언트 측에서 int, first와 last를 볼 수는 있지만 메서드를 볼 수는 없습니다 ... pService.Person p = API.GetPerson (123); – sam

+0

범위가 공개로 범위가 지정되어 있습니까? –

관련 문제