2014-06-08 3 views
0

오케이 이것이 시나리오입니다! 확실히 실수를하고 있음을 알고 있지만 기본 사항을 지우고 성공적으로 구현하려고합니다. WCF의 DataContract 인 Employee 클래스가 있으며 FullTimeEmployee 및 PartTimeEmployee 클래스가 확장됩니다. 내 EmployeeService에서 콘솔 응용 프로그램 클라이언트 (전용 전용)에서 각각 사용자 입력을 기반으로 FullTimeEmployee 및 PartTimeEmployee의 개체를 반환합니다. 이제 MessgaeContract의 SOAP 메시지를 조정하고 싶습니다. 요청 객체를 EmployeeRequestObject라고하고 응답 객체 인 EmployeeResponseObject를 원하고 동일한 라이센스 키를 헤더에 포함하고자합니다.WCF에서 MessageContract를 구현하는 방법은 무엇입니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace EmployeeServiceLibrary 
{ 
[ServiceContract] 
public interface IEmployeeService 
{ 
    [OperationContract] 
    EmployeeResponse GetEmployee(EmployeeRequest request); 
} 

#region EmployeeRequestObject 

[MessageContract(IsWrapped=true,WrapperName="EmployeeRequestObject",WrapperNamespace="http://Chiranjib_VAIO.com/")] 
public class EmployeeRequest 
{ 
    [MessageBodyMember(Namespace = "http://Chiranjib_VAIO.com/")] 
    public int EmployeeRequestID { get; set; } 

    [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")] 
    public string EmployeeRequestLicenseKey { get; set; } 
} 
#endregion 

#region EmployeeResponseObject 
public class EmployeeResponse 
{ 
    public EmployeeResponse() 
    { 
    } 

    public EmployeeResponse(EmployeeRequest e) 
    { 
     this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response"; 
    } 

    [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")] 
    public string EmployeeResponseLicenseKey { get; set; } 
} 
#endregion 

[KnownType(typeof(FullTimeEmployee))] 
[KnownType(typeof(PartTimeEmployee))] 
[DataContract] 
public abstract class Employee 
{ 
    [DataMember] 
    public int EmployeeId { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Gender { get; set; } 

    [DataMember] 
    public EmployeeType EmpType { get; set; } 
} 

public enum EmployeeType 
{ 
    FullTimeEmployee=0, 
    PartTimeEmployee=1 
} 

[DataContract] 
public class FullTimeEmployee : Employee 
{ 
    [DataMember] 
    public decimal AnnualSalary { get; set; } 
} 

[DataContract] 
public class PartTimeEmployee : Employee 
{ 
    [DataMember] 
    public int HoursWorked { get; set; } 

    [DataMember] 
    public decimal SalaryPerHour { get; set; } 
} 
} 

사용자가 0이 나는 ​​FullTimeEmployee 개체가 반환 될 원하는 입력이 1 내가 원하는 때 PartTimeEmployee 개체가 반환 될 입력. 다음은 서비스 파일

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace EmployeeServiceLibrary 
{ 
public class EmployeeService : IEmployeeService 
{ 
    public EmployeeResponse GetEmployee(EmployeeRequest request) 
    { 
     int empId = request.EmployeeRequestID; 
     switch (empId) 
     { 
      case 0: 
       return new FullTimeEmployee() 
       { 
        EmployeeId=1, 
        Name="Chiranjib Nandy", 
        Gender="Male", 
        EmpType=EmployeeType.FullTimeEmployee, 
        AnnualSalary=1500 
       }; 
      case 1: 
       return new PartTimeEmployee() 
       { 
        EmployeeId = 1, 
        Name = "Archana Nandy", 
        Gender = "Female", 
        EmpType = EmployeeType.PartTimeEmployee, 
        HoursWorked=9, 
        SalaryPerHour=150 
       }; 
      default: return null; 
     } 
    } 
} 

} 

하지만 오류가 암시 적으로 EmployeeServiceLibrary.EmployeeResponse에 EmployeeServiceLibrary.FullTimeEmployee을 변환 할 수 없습니다 말하고있다. 원하는 동작을 달성하는 방법? 도움이 매우 감사합니다! 감사합니다

+0

내가 궁금가 이벤트 컴파일하는 경우, 당신은'반환 Employee'하지만'EmployeeResponse'이 클래스를 기대 공통점이 없다. – Uriil

답변

1

Employee이 아닌 EmployeeResponse을 반환하는 두 가지 반환 유형이 있으므로 코드가 컴파일되지 않습니다. 당신은 당신의 EmployeeResponse

public class EmployeeResponse 
{ 
    public EmployeeResponse(EmployeeRequest e) 
    { 
     this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response"; 
    } 

    [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")] 
    public string EmployeeResponseLicenseKey { get; set; } 

    public Employee Employee { get; set; } 
} 

내부 Employee 객체를 캡슐화하고 다음에 코드를 수정할 수 있습니다

public EmployeeResponse GetEmployee(EmployeeRequest request) 
{ 
    int empId = request.EmployeeRequestID; 
    switch (empId) 
    { 
     case 0: 
      return new EmployeeResponse 
      { 
       Employee = new FullTimeEmployee() 
       { 
       EmployeeId=1, 
       Name="Chiranjib Nandy", 
       Gender="Male", 
       EmpType=EmployeeType.FullTimeEmployee, 
       AnnualSalary=1500 
       } 
      } 
     case 1: 
      return new EmployeeResponse 
      { 
       Employee = new PartTimeEmployee() 
       { 
        EmployeeId = 1, 
        Name = "Archana Nandy", 
        Gender = "Female", 
        EmpType = EmployeeType.PartTimeEmployee, 
        HoursWorked=9, 
        SalaryPerHour=150 
       } 
      } 

     default: return null; 
} 
관련 문제