0

私はここで少し混乱しています。選択したオプションに応じて、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の原則に違反しています。列挙型に新しいオプションが追加されるたびに、そのオプションのデータを取得するために、もう 1 つのプロパティを追加するOptionsように変更する必要があります。MyDTO

この場合変更MyDTOしてもよろしいですか、それともより良い設計はありますか?

4

1 に答える 1

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; }
}

enum便利な etc の使用のために を追加することもできますが、実際には冗長な情報になるため、 でswitchある必要はありません。[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; } }
}
于 2013-09-06T11:30:47.627 に答える