Note that there are some explanatory texts on larger screens.

plurals
  1. POshould I ever put a major version number into a C#/Java namespace?
    text
    copied!<p>I am designing a set of 'service' layer objects (data objects and interface definitions) for a WCF web service (that will be consumed by third party clients i.e. not in-house, so outside my direct control).</p> <p>I know that I am not going to get the interface definition exactly right - and am wanting to prepare for the time when I know that I will have to introduce a breaking set of new data objects. However, the reality of the world I am in is that I will also need to run my first version simultaneously for quite a while.</p> <p>The first version of my service will have URL of <a href="http://host/app/v1service.svc" rel="noreferrer">http://host/app/v1service.svc</a></p> <p>and when the times comes by new version will live at <a href="http://host/app/v2service.svc" rel="noreferrer">http://host/app/v2service.svc</a></p> <p>However, when it comes to the data objects and interfaces, I am toying with putting the 'major' version of the interface number into the actual namespace of the classes.</p> <pre><code>namespace Company.Product.V1 { [DataContract(Namespace = "company-product-v1")] public class Widget { [DataMember] string widgetName; } public interface IFunction { Widget GetWidgetData(int code); } } </code></pre> <p>When the time comes for a fundamental change to the service, I will introduce some classes like</p> <pre><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); } } </code></pre> <p>The advantages as I see it are that I will be able to have a single set of code serving both interface versions, sharing functionality where possible. This is because I will be able to reference both interface versions as a distinct set of C# objects. Similarly, clients may use both interface versions simultaneously, perhaps using V1.Widget in some legacy code whilst new bits move on to V2.Widget.</p> <p>Can anyone tell why this is a stupid idea? I have a nagging feeling that this is a bit smelly..</p> <p>notes: I am obviously not proposing every single new version of the service would be in a new namespace. Presumably I will do as many non-breaking interface changes as possible, but I know that I will hit a point where all the data modelling will probably need a significant rewrite.</p> <p>I understand assembly versioning etc but I think this question is tangential to that type of versioning. But I could be wrong.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload