2014-02-21 1 views
0

WCF 데이터 서비스를 사용하여 OData 끝점을 내 서비스로 제공하고 있습니다. 최근 엔 entites 중 하나에 속성을 추가해야한다는 요구 사항이 있지만 서비스의 일부로 반환하지 않기를 바랍니다. 그래서 기본적인 구현 -WCF 데이터 서비스 제거 엔터티 필드

[DataServiceEntity] 
public class Customer 
{ 
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int customer_id { get; set; } 

    [Required] 
    public string customer_name { get; set; } 

    public int customer_hidden { get; set; } 
} 

위의 클래스 DataService에 의해 사용되는 내 DbContext의 일부입니다 : 내가 먼저 코드를 사용하고

, 내 엔티티에 비슷한입니다.

아마도 일부 DataAnnotation을 사용하여 customer_hidden이 클라이언트로 반환되는 것을 방지 할 수있는 방법이 있습니까?

답변

0

데이터 계층과 서비스 계층에서 동일한 개체를 사용하지 않는 것이 좋습니다. 서버와 클라이언트간에 긴밀한 결합이 만들어지기 때문입니다.

귀하의 질문에 드러남, 나는 다음과 같이 생각합니다 : 서버쪽에 고객이 숨겨져 있다는 정보, 클라이언트가 액세스해서는 안되는 정보를 나타내는 플래그가 필요합니다.

대신이 속성을 포함하지 않는 서비스 계층 (예 : WCF 서비스 인터페이스 메서드)에서 DTO's을 사용할 수 있습니다.

public class CustomerDto 
{ 
    public int customer_id { get; set; } 

    public string customer_name { get; set; } 
} 

당신은 엔티티 객체와 DTO의 사이에 매핑이 어떤 종류의 필요,하지만 당신을 위해 처리 할 수있는 좋은 타사 라이브러리가있다. 나는 Automapper을 사용한다.

이 접근법을 통해 느슨한 결합을하면 다양한 이점을 얻을 수 있습니다. 예를 들어 서버 쪽에서 고객 개체를 확장하거나 변경하고 주소 데이터, 전화 번호 등을 추가하거나 customer_id ~ CustomerId의 이름을 바꾸는 것을 고려하십시오. 이러한 모든 업데이트는이 접근 방식을 통해 클라이언트에서 숨길 수 있습니다. 추가 된 필드의 경우 매핑을 그대로 유지하거나 매핑 이름을 약간 변경합니다 (이름이 바뀐 필드의 경우).

그런 다음 클라이언트가 새 기능을 지원하도록 업데이트 된 경우 새 속성을 포함하도록 서비스 계층을 확장합니다.

이 방법을 전체적으로 사용하려면 클라이언트 쪽 사용에 특화된 클라이언트 (GUI) 엔티티에 DTO를 다시 매핑해야합니다. 최근에 개체가 인쇄되었는지 여부를 나타내는 클라이언트 개체에 플래그가 있어야했습니다. 이러한 종류의 플래그는 서비스 계층이나 서버에는 존재하지 않지만 클라이언트 객체를 만들었으므로 문제가되지 않습니다.

이 접근법의 단점은 클라이언트 측에서 null이 나오지만 내 경험에 의하면 이러한 종류의 버그는 쉽게 추적 할 수 있다는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 정확한 답변이므로 답변을 수락하겠습니다. 그러나 DTO 및 매핑을 구현하는 데 시간이 많이 걸리지 않고 직접 액세스 한 많은 엔티티가 있으므로 궁금한 점이 있습니까? DTO 접근법없이 반원을 빨리 숨길 수 있습니까? – eoghank

+0

그러면이 속성이 원하는 것입니다. http://msdn.microsoft.com/en-us/library/system.data.services.ignorepropertiesattribute.aspx –

관련 문제