我应该将主要版本号放入C#/ Java命名空间吗?

时间:2010-05-10 04:17:44

标签: c# web-services oop

我正在设计一组'服务'图层对象(数据对象和 接口定义)用于WCF Web服务(将被使用) 由第三方客户,即不在内部,所以在我直接控制之外)。

我知道我是 不会让接口定义完全正确 - 而且是 我知道自己必须做好准备 介绍一组新的数据对象。然而,现实 我所处的世界是我还需要运行我的第一个版本 同时相当长一段时间。

我服务的第一个版本的网址为 http://host/app/v1service.svc

当新版本到来的时候将会存在 http://host/app/v2service.svc

然而,当谈到数据对象和接口时,我 我正在设置接口号的“主要​​”版本 进入类的实际命名空间。

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 个答案:

答案 0 :(得分:3)

我已经按照你的方式(使用V1V2命名空间和Common命名空间)完成了它,并且它运行得相当好。基本上,我在Common命名空间中实现了实际代码,并且每个V1V2等只是充当它的包装。

在我们的案例中,旧版本通常会保留一段时间。通常,当客户端请求访问我们的API时,我们会给他们当前的“当前”版本,然后他们将永远使用它 - 除非有一个严重的商业案例转移到更新版本,然后他们几乎永远不会。

答案 1 :(得分:1)

通常我已经看过(并且完成了自己)只是简单地调用版本2 Widget2,IWidget2等。如果你期望v2(可能)是最终版本,基于从野外看到v1的经验教训,那就是通常很好。但如果你认为它更像是一个不断发展的事情,也许可以考虑一种更流畅的合同方式。