2013-09-06 2 views
0

나는 여기서 약간 혼란 스럽다. 선택한 DTO의 특정 속성 만 선택한 옵션에 따라 유효한 시나리오가 있습니다. 그래서, 나는 아래의 디자인을 내놓았다.DTO에 선택적 매개 변수를 포함해도됩니까?

[DataContract] 
class MyDTO 
{ 
    [DataMember] 
    public BaseData CommonData { get; set; } 
    [DataMember] 
    public Options AvailableOptions { get; set; } 
    [DataMember] 
    public Option1Data Data1 { get; set; } 
    [DataMember] 
    public Option2Data Data2 { get; set; } 
} 
[DataContract] 
public class BaseData 
{ 
    [DataMember] 
    public int BaseVar1 { get; set; }   
} 

[DataContract] 
public enum Options 
{ 
    [EnumMember] 
    Option1, 
    [EnumMember] 
    Option2 
} 

[DataContract] 
public class Option1Data 
{ 
    [DataMember] 
    public string Option1Var1 { get; set; } 
} 

[DataContract] 
public class Option2Data 
{ 
    [DataMember] 
    public string Option2Var1 { get; set; } 
} 

그러나 명확하게 MyDTO 클래스는 OCP 원칙을 위반하는 것입니다. 새로운 옵션이 Options enum에 추가되면 MyDTO을 변경하여 해당 옵션에 대한 데이터를 검색 할 속성을 하나 더 추가해야합니다.

MyDTO을 변경하는 것이 좋습니까? 아니면 더 좋은 디자인이 있습니까?

답변

0

상속은 어떨까요?

[DataContract] 
[KnownType(typeof(Option1))] 
[KnownType(typeof(Option2))] 
public abstract class BaseData 
{ 
    [DataMember] 
    public int BaseVar1 { get; set; }   
} 

[DataContract] 
public class Option1 : BaseData 
{ 
    [DataMember] 
    public string Option1Var1 { get; set; } 
} 

[DataContract] 
public class Option2 : BaseData 
{ 
    [DataMember] 
    public string Option2Var1 { get; set; } 
} 

또한 등 switch 편리한 사용을위한 enum을 추가 할 수 있지만, 실제로 것으로는 [DataMember]로 중복 정보가 필요하지 않을 : 나는 비트입니다 말했듯이

public enum Options 
{ 
    Option1, 
    Option2 
} 

[DataContract] 
[KnownType(typeof(Option1))] 
[KnownType(typeof(Option2))] 
public abstract class BaseData 
{ 
    [DataMember] 
    public int BaseVar1 { get; set; }   
    [IgnoreDataMember] 
    public abstract Options Option {get;} 
} 

[DataContract] 
public class Option1 : BaseData 
{ 
    [DataMember] 
    public string Option1Var1 { get; set; } 
    [IgnoreDataMember] 
    public override Options Option {get { return Options.Option1; } } 
} 

[DataContract] 
public class Option2 : BaseData 
{ 
    [DataMember] 
    public string Option2Var1 { get; set; } 
    [IgnoreDataMember] 
    public override Options Option {get { return Options.Option2; } } 
} 
+1

을 혼란스러워. 일반적으로 기본 클래스와의 긴밀한 결합을 피하기 위해 상속에 비해 composition을 사용하는 것이 좋습니다 (BaseData에 새 속성을 추가하면 특정 파생 된 유형에 필요하지 않은 모든 파생 된 유형에서 자동으로 상속됩니다) . 그래서, MyDTO 클래스에서 BaseData의 composition을 사용했습니다. – Imran

+0

@Imran 솔직히 기존 코드를 사용하십시오.하지만 열거 형을 제거 할 수도 있습니다. 아무 것도 추가하지 않으며 중복됩니다. 호출자는 * 사용할 수있는 데이터를 확인할 수 있습니다. ('null'등을 확인하여). –

+0

기존 코드가 만족스럽지 않습니다 :). 나는 enum이 중복된다는 것에 동의한다. 옵션에 따라 정확한 속성을 맞추기 위해 편의를 위해 추가했습니다. 그러나 기존의 코드를 사용하는 경우 한 가지 장점이 있다고 생각합니다. 추상적 인 Option 메서드에 따라 BaseData를 Option1 또는 Option2로 다운 캐스팅 할 필요가 없습니다. – Imran

관련 문제