我是否应该在C#/Java名称空间中输入主要版本号?

我是否应该在C#/Java名称空间中输入主要版本号?,c#,web-services,oop,C#,Web Services,Oop,我正在设计一组“服务”层对象(数据对象和 WCF web服务(将被使用)的接口定义 由第三方客户(即非内部客户,因此不受我的直接控制) 我知道我是 没有得到完全正确的接口定义-而且 想为我知道我将不得不这样做的时候做准备 引入一组新的数据对象。然而,现实 我所处的世界是,我还需要运行我的第一个版本 同时进行了相当长的一段时间 我的服务的第一个版本的URL为 当时代来临时,新版本将在 然而,当涉及到数据对象和接口时,我 我在玩弄把“主要”版本的接口编号 进入类的实际名称空间 namespace

我正在设计一组“服务”层对象(数据对象和 WCF web服务(将被使用)的接口定义 由第三方客户(即非内部客户,因此不受我的直接控制)

我知道我是 没有得到完全正确的接口定义-而且 想为我知道我将不得不这样做的时候做准备 引入一组新的数据对象。然而,现实 我所处的世界是,我还需要运行我的第一个版本 同时进行了相当长的一段时间

我的服务的第一个版本的URL为

当时代来临时,新版本将在

然而,当涉及到数据对象和接口时,我 我在玩弄把“主要”版本的接口编号 进入类的实际名称空间

namespace Company.Product.V1
{
   [DataContract(Namespace = "company-product-v1")]
   public class Widget
   {
        [DataMember]
        string widgetName;
   }

   public interface IFunction
   {
       Widget GetWidgetData(int code);
   }
}
当服务发生根本性变化时,我将介绍 有些班级喜欢

namespace Company.Product.V2
{
   [DataContract(Namespace = "company-product-v2")]
   public class Widget
   {
        [DataMember]
        int widgetCode;

        [DataMember]
        int widgetExpiry;
   }

   public interface IFunction
   {
       Widget GetWidgetData(int code);
   }
}
在我看来,这样做的好处是我可以有一个单人房 为两个接口版本提供服务的代码集,共享功能 如果可能的话。这是因为我 将能够将两个接口版本作为一个不同的引用 C#对象集。类似地,客户端可以同时使用这两个接口 同时使用V1.Widget,在一些遗留版本中 代码,同时新位移到V2.Widget

谁能告诉我为什么这是一个愚蠢的想法?我有种唠叨的感觉 这有点臭

注: 很明显,我并不是在建议每一个新版本的服务 将位于新的命名空间中。想必我也会这么做 非中断接口会尽可能地更改,但我知道 将达到所有数据建模可能需要 重要的重写

我理解程序集版本控制等,但我认为这个问题是
与该类型的版本控制相切。但是我可能是错的。

通常我看到(我自己也看到过)简单地调用版本2 Widget2、IWidget2等。如果你(可能)认为v2是最终结果,根据在野外看到v1的经验教训,这通常是好的。但是,如果你认为它更像是一个不断发展的东西,也许可以考虑一种更灵活的契约方法。

我已经按照你的方式完成了(使用
V1
V2
名称空间和
通用
名称空间),而且效果相当不错。基本上,我在
Common
名称空间中实现了实际的代码,
V1
V2
等都只是作为它的包装器

在我们的例子中,旧版本通常会保留一段时间。通常,当客户请求访问我们的API时,我们会给他们“当前”版本,然后他们会永远使用这个版本——除非有一个严肃的商业案例需要迁移到新版本,否则他们几乎永远不会这样做