我想更改某个类型的程序集,但仍然可以向后兼容该类型位于不同程序集中的旧客户端
我的旧知名类型是
<add type="Messages.GetImageRoutingRulesResponseMessage, Feeder.Data">
<knownType type="Rules.DicomPushRule, Feeder.Logic" />
</add>
我将DicomPushRule的位置更改为Feeder.Data,因此我的新知识类型将如下所示:
<add type="Messages.GetImageRoutingRulesResponseMessage, Feeder.Data">
<knownType type="Rules.DicomPushRule, Feeder.Data" />
</add>
这会向后兼容吗?
答案 0 :(得分:2)
这取决于你的合同。
让我们考虑两个选择:
您有两个相同的类,但在不同的命名空间中:
<强> DataContract:强>
namespace Feeder.Contract
{
[DataContract]
public class DividendBase
{
[DataMember]
public DateTime AnnouncementDate { get; set; }
}
}
namespace Feeder.Logic
{
[DataContract]
public class Dividend : DividendBase
{
[DataMember]
public float Amount { get; set; }
[DataMember]
public DateTime ExDate { get; set; }
}
}
namespace Feeder.Data
{
[DataContract]
public class Dividend : DividendBase
{
[DataMember]
public float Amount { get; set; }
[DataMember]
public DateTime ExDate { get; set; }
}
}
对于这种情况,类不兼容,因为它们具有不同的名称空间,并且在xml中看起来会有所不同。
在xml中序列化:
<DividendBase i:type="a:Dividend"
xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="http://schemas.datacontract.org/2004/07/Feeder.Logic">
<AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
<a:Amount>1.2</a:Amount>
<a:ExDate>2014-05-20T12:21:42.3608838+03:00</a:ExDate>
</DividendBase>
<DividendBase i:type="a:Dividend"
xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="http://schemas.datacontract.org/2004/07/Feeder.Data">
<AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
<a:Amount>1.2</a:Amount>
<a:ExDate>2014-05-20T12:23:21.2888838+03:00</a:ExDate>
</DividendBase>
但如果您为这两个类应用NameSpace属性,它们将是兼容的。
属性中名称空间的数据合同 :
namespace Feeder.Contract
{
[DataContract]
public class DividendBase
{
[DataMember]
public DateTime AnnouncementDate { get; set; }
}
}
namespace Feeder.Logic
{
[DataContract(Namespace = "Feeder.Contracts")]
public class Dividend : DividendBase
{
[DataMember]
public float Amount { get; set; }
[DataMember]
public DateTime ExDate { get; set; }
}
}
namespace Feeder.Data
{
[DataContract(Namespace = "Feeder.Contracts")]
public class Dividend : DividendBase
{
[DataMember]
public float Amount { get; set; }
[DataMember]
public DateTime ExDate { get; set; }
}
}
两者的XML :
<DividendBase i:type="a:Dividend"
xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="Feeder.Contracts">
<AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
<a:Amount>1.2</a:Amount>
<a:ExDate>2014-05-20T12:25:54.7178838+03:00</a:ExDate>
</DividendBase>
<DividendBase i:type="a:Dividend"
xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="Feeder.Contracts">
<AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
<a:Amount>1.2</a:Amount>
<a:ExDate>2014-05-20T12:26:41.1278838+03:00</a:ExDate>
</DividendBase>
如您所见,xml是相同的,因此类是兼容的。
如果您有第一个变种,那么,我担心,您的课程不兼容。