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
을 변경하는 것이 좋습니까? 아니면 더 좋은 디자인이 있습니까?
을 혼란스러워. 일반적으로 기본 클래스와의 긴밀한 결합을 피하기 위해 상속에 비해 composition을 사용하는 것이 좋습니다 (BaseData에 새 속성을 추가하면 특정 파생 된 유형에 필요하지 않은 모든 파생 된 유형에서 자동으로 상속됩니다) . 그래서, MyDTO 클래스에서 BaseData의 composition을 사용했습니다. – Imran
@Imran 솔직히 기존 코드를 사용하십시오.하지만 열거 형을 제거 할 수도 있습니다. 아무 것도 추가하지 않으며 중복됩니다. 호출자는 * 사용할 수있는 데이터를 확인할 수 있습니다. ('null'등을 확인하여). –
기존 코드가 만족스럽지 않습니다 :). 나는 enum이 중복된다는 것에 동의한다. 옵션에 따라 정확한 속성을 맞추기 위해 편의를 위해 추가했습니다. 그러나 기존의 코드를 사용하는 경우 한 가지 장점이 있다고 생각합니다. 추상적 인 Option 메서드에 따라 BaseData를 Option1 또는 Option2로 다운 캐스팅 할 필요가 없습니다. – Imran