2012-05-03 5 views
-1

안녕하세요 일부 강의 노트를 읽고 그리고 나는 왜이 방법을 해결하지 못할 :운영 계약서를 사용하는 것이 좋고 나쁨.

[OperationContract] 
Student PostStudent (Student student); 

좋은입니다.

그리고이 방법은 나쁜 : 내 구현 버전이 나쁜 경우에 따라서 임 확실하지 임 또한 내 강사가

을 확실 가지고

[OperationContract] 
void PostStudent(Student student); 

방법 :

[OperationContract] 
void PostStudent (string firstname, string lastname etc..); 

아직 내 구현 버전이 있습니다

Student PostStudent (Student student); //?

+3

"이 방법이 좋지 않다"는 것이 무슨 뜻인지 자세히 설명해 주실 수 있습니까? – mgnoonan

+0

메소드 매개 변수의 수가 너무 많아서 ('... '에서 몇 번이나 빠져 나갔습니까?) 메소드가''나쁜' '상태라는 것을 볼 수 있습니다.매개 변수 이름에 대해 낙타 케이싱을 사용하지 않을 수도 있지만 그렇지 않으면 실제로 나쁜 점이 없습니다. –

+0

강사가 "좋은"구현이라고 설명하는 것에 대한 선호는 입력 유형이 문자열이 아닌 '학생'이라는 사실에 기반합니다. 이것은 각 매개 변수의 의미에 대해 혼동을 덜 일으킬 수 있습니다. 그러나 나중에 수행하기로 결정해야하는 경우 매개 변수의 REST 스타일 URL 매핑을 방지합니다. – faester

답변

3

웹 서비스는 메시지를 사용하여 작성됩니다. WCF의 메시지는 사용자의 Student 클래스 인 클래스를 작성하고 DataContract 속성으로 표시하는 (optionally) 클래스를 작성하여 정의됩니다. 이렇게하면 해당 클래스의 properties에서 버전 지정 및 다양한 속성 설정이 가능합니다 (후자의 효과는 MessageParameter 속성을 사용하여 얻을 수도 있음).

그렇습니다. PostStudent (string firstname, string lastname etc..)은 좋지 않습니다.

해당 메서드에서 무언가를 반환할지 여부는 전적으로 귀하에게 달려 있습니다. A void은 완벽하게 문제가되지 않습니다. 예를 들어 SOAP을 사용하면 사용자를 만들 수없는 이유를 나타내는 오류를 반환 할 수 있습니다. 오류가 발생하지 않으면 생성이 잘되었다는 의미입니다.

당신이 만든 학생을 inpect하려는 경우, 당신은뿐만 아니라 속성을 포함하는 PostStudentResult (또는 PostResult<T>) 클래스를 정의하고 그것을 반환 할 수 있습니다 Student (또는 T Result)와 그것이 만들어지는 바와 같이, 제 1 학생을 포함 Status, 후자는 생성이 성공했는지 여부를 나타냅니다.

+2

+1 저에게 "좋은"버전의 주된 차이점은 더 미래의 증거일까요 ... 버전 관리가 훨씬 뛰어나다는 것입니다. http://msdn.microsoft.com/en-us/library/ms731060.aspx –

0

웹 서비스의 반환 값은 일반적으로 좋지 않습니다. 그래서 그것은 매개 변수에 관한 것입니다. 함께 속한 데이터는 Objects에 래핑되어야합니다.

Post 메서드는 반환 값을 전혀 가져 오지 않아야합니다. 게시하면 오류가 발생하면 예외가 발생합니다.

당신의 필요가 일부 학생을받을 경우와 같은 방법 작성해야합니다 : 그것은 WCF 후 지정 조치도 무효 방법과 좋은 연습이 될 수있는 경우

Student GetStudentByName(string name); 
0

evryone이 말했듯이 너무 많은 메소드 매개 변수를 사용하는 것은 좋지 않습니다. 어떤 방식 으로든 당신의 서명과 당신이 언급 한 좋은 서명 사이에 단 하나의 차이 만 볼 수 있습니다. 학생 객체를 반환하는 것은 예를 들어 db에 추가 한 후에 학생의 ID를 가질 수있는 능력을 제공합니다. 객체의 다른 계산 된 속성에도 동일한 작업이 적용됩니다. void 메소드를 사용하면 객체를 다시로드해야합니다. 즉, 객체를 게시 한 후 객체를 직접 사용하려는 경우 서버에 대한 추가 이동을 의미합니다. void WCF 메서드를 사용하는 모든 방법은 객체를 반환하는 것이 여분의 대역폭 일 뿐이라면 나쁘지 않습니다.