2012-10-12 4 views
0

필자는 인터페이스 속성에 거의 또는 전혀 변경 가능성이없는 인터페이스에 대해 매우 엄격하게 코딩하는 여러 프로젝트에서 작업 해 왔습니다. 그런 다음, 임의의 방법으로 객체를 변경하고 반환하는 임의의 기능을 제공하는 클래스를 작성합니다.이것은 DTO 또는 ...의 예입니까?

public interface IOlapCube 
{ 
    String CubeName {get;} 
    IEnumerable<IDimension> Dimensions{get;} 
    IEnumerable<IMeasure> Measures {get;} 
    IEnumerable<IMeasureGroup> MeasureGroups {get;} 
} 

public class OlapCubeRW : IOlapCube 
{ 
    public String CubeName {get;set;} 
    private List<IDimension> _dimensionList; 
    public IList<IDimension> Dimensions{get{return this._dimensionList;}} 
    IEnumerable<IDimension> IOlapCube.Dimensions{get{return this.Dimensions;}} 

    //... similar for the rest 
} 

는 이것을 DTO가 : 여기

은 예입니다? 이 클래스는 어디에 정의해야합니까? 그것은 IOlap 큐브와 같은 어셈블리에 있어야합니까? 그렇다면 동일한 이름 공간에 있어야합니까? IOlapCube를 사용하는 여러 프로젝트가 RW 클래스의 이점을 얻을 수 있다는 것을 알았습니다. 각 프로젝트에서 동일한 내부 클래스를 다시 구현하는 것을 싫어합니다. 이 클래스들은 임의의 파생 클래스를 생성하고 인터페이스로 참조 할 수있는 단위 테스트에도 유용합니다. 예를 들어, 각 인터페이스에는 관련 IEqualityComparer가 있으며 unit unit 테스트는 원하는 모양으로 두 개의 객체를 만들고 비교할 때 상당히 간단합니다.

이들은 일반적으로 엔티티를 편집하는데도 사용됩니다. 엔티티를 양식에 전달하고 이러한 개체 중 하나로 복사 할 수 있습니다. 그런 다음 양식에서 임의로 개체를 변경할 수 있으며 bool과 같은 외부 클래스로 유효성을 검사 할 수 있습니다. OlapCubeValidator.IsValid (IOlapCube cubeToValidate); 유효성 검사가 통과되면 변경 사항을 엔티티로 다시 복사합니다 (이제는 유효한 RW 클래스를 통한 엔티티 프록시 일 수 있습니다).

클라이언트는 IOlap과 같은 위치에 두는 것이 잘못되었습니다. 왜냐하면 클라이언트가 이들 중 하나를 회전시켜 사용해서는 안되기 때문입니다.하지만 외부에서 유효성 검사를 수행 할 수 있다면 아무런 상처를주지 않을 것입니다. . 이 특정 프로젝트는 회사 내부에 있으므로 악의적 인 프로그래밍에 대해 걱정할 필요가 없습니다. 이것이 공개적으로 이용 가능한 도서관이라면 무엇이 바뀌겠습니까?

EDIT 또한이 인터페이스 계층 (IOlapCube> IDimension, IMeasureGroup, IMeasure> IHierarchy> ILevel> IMember)는 어떠한 방법이나 다른 기능을 노출 없다는 것을 유의하는 것이 중요하다; 데이터 (예 : 이름, 하위 객체, IsVisible ...) 만 제공합니다. 은 IQueryable (T) ExecuteQuery (T) (ICriteria (T) criteria)와 같은 메서드가 없습니다. 유효성 검증 및 동등성 정의는 외부 인터페이스의 일부입니다 (예 : IEqualityComparer).

+0

[예/아니오에 대한 질문은이 사이트에 적합하지 않습니다.] (http://meta.stackoverflow.com/questions/258630/where-is-the-line-for-yes-no-questions). 이러한 질문에 대한 답변은 원래의 질문자를 제외한 모든 사람에게 거의 도움이되지 않습니다. 이 사이트의 목적은 답변과 함께 고품질 질문의 유용한 저장소를 만드는 것입니다. "이게 _X_의 예"라고 묻는 대신 "what is _X_"을 물어보십시오. – Raedwald

답변

0

DTO가 데이터를 보유하는 데 사용되는 경우 (비즈니스 로직 없음), 동일한 어셈블리 또는 다른 어셈블리에 인터페이스를 유지하더라도 상관 없습니다.