C# 在Microsoft Web API 2中对模型对象进行版本控制(REST、MVC)

C# 在Microsoft Web API 2中对模型对象进行版本控制(REST、MVC),c#,visual-studio-2013,C#,Visual Studio 2013,我们有一个RESTAPI,它已经在控制器路由中使用了“/v1/”,我们计划创建一个“/v2/”路径,并利用WebAPI 2。我能够找到很多关于控制器版本控制的信息(属性路由、自定义解析程序等),但有一件事我没有找到任何关于模型对象(也称为数据传输对象)版本控制的文章。人们如何对其模型对象进行版本控制 在我们的代码库和问题域中,控制器是“简单的”(CRUD,真的),模型对象编码了我们的领域专业知识,并在其上运行我们的核心业务逻辑。(我怀疑许多应用程序都是这样,所以奇怪的是,大多数关于web API

我们有一个RESTAPI,它已经在控制器路由中使用了“/v1/”,我们计划创建一个“/v2/”路径,并利用WebAPI 2。我能够找到很多关于控制器版本控制的信息(属性路由、自定义解析程序等),但有一件事我没有找到任何关于模型对象(也称为数据传输对象)版本控制的文章。人们如何对其模型对象进行版本控制

在我们的代码库和问题域中,控制器是“简单的”(CRUD,真的),模型对象编码了我们的领域专业知识,并在其上运行我们的核心业务逻辑。(我怀疑许多应用程序都是这样,所以奇怪的是,大多数关于web API 2和版本控制的web文章都集中在控制器上,而忽略了模型对象,好像它们会自行处理一样。)

在一个完美的世界中,我希望能够对两个API版本使用相同的类,并将属性放在属性上以包含或排除它们,例如“仅限版本1”、“仅限版本2+”和“在版本2中不推荐使用”等。我想我可以用一个自定义序列化程序来实现这一点,该序列化程序会查找我创建的属性类,但我想知道,在我推出自己的产品之前,是否有内置的支持或开源库

另一种可能的方法是从Version1模型类派生Version2模型类,但我只能这样添加,不能删除任何内容。我可以从基类派生version 1和version 2类,但是这些基于继承的方法中的任何一个都需要a)重构其中的类加上B)工厂模式,以便内部可以创建正确的派生类型。我希望避免这种情况,但还是希望它优于代码复制

我认为另一种方法是,我们可以隐藏真实的模型对象,并将它们的值复制到接口处的“哑”数据传输对象中。这种方法很简单,具有最大的灵活性,但也可以最大限度地提高工作效率


有没有我错过的选择?其他人在使用什么方法?

在一个项目(RoR到C#转换)中,我计划使用上一个项目,其中我们有表示数据库结构和业务逻辑的模型,然后有可以修改该模型实际返回的内容(或模型本身)的ModelView类。PoC在我们的案例中显示了它是可行的方法,但在我们真正实现它之前,项目就被取消了。另一个选择是,XmlSerializer理解一个特殊命名的属性,该属性告诉您是否序列化给定的属性(根据命名约定,目前无法回忆),您可以通过版本控制来使用该属性-序列化程序如何知道要序列化哪个API版本?我所能想到的就是实际使用DTO本身的一个属性来表示这一点;为了方便起见,我们的应用程序架构师已经在所有DTO上包含了一个“ApiVersion”属性,我可以为此选择该属性。是的,该信息必须来自某个上下文,并且您的模型需要知道要序列化的版本,以及该版本需要序列化的内容。您如何对模型进行版本设置?每个模型都只知道自己的历史,以及如何根据其上下文版本的内容进行操作?这一点很好。无论我有不同类型的模型还是可选的模型属性,我都必须a)向应用程序内部指明我想要返回的模型类型,b)每个版本的模型行为必须正确。如果我对每个api版本都有一个单独的控制器类,那么控制器本身就会知道它是什么版本,并且可以采取正确的操作,如果我有一个共享的控制器实现,我可以从URI组件中获得它。B/w,另一种方法(我从来没有尝试过,所以可能完全不可行)就是简单地有几个“应用程序”只是相同版本的应用程序,安装在不同的基本URL下,具有不同的版本。然后,您的模型不需要了解任何版本控制,您只需拥有不同版本的代码分支、全部构建、全部发布,并使代码保持简单,同时让服务器提供您过去拥有的所有不同版本(并且仍然能够通过适当的标记/分支策略修复旧版本中的错误)。这将满足我的“KISS”设计模式要求:)