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原则。每当在枚举中添加一个新选项时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方便的switchetc 使用,但它不需要是 a [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 回答