我在同一个项目中使用 ASP.NET MVC 和 ASP.NET Web API。我正在争论是否将这些模型分开(即,将 MVC 模型放在“Models”文件夹中,并将 Web API 模型放在“ApiModels”文件夹中)。
我应该(不)这样做吗?将它们分开会导致问题吗?将它们放在一起并为 MVC 和 Web API 使用相同的模型会导致问题吗?
我在同一个项目中使用 ASP.NET MVC 和 ASP.NET Web API。我正在争论是否将这些模型分开(即,将 MVC 模型放在“Models”文件夹中,并将 Web API 模型放在“ApiModels”文件夹中)。
我应该(不)这样做吗?将它们分开会导致问题吗?将它们放在一起并为 MVC 和 Web API 使用相同的模型会导致问题吗?
我应该(不)这样做吗?
我必须同意 codehunter 和 HollyStyles。这取决于,但你应该倾向于“让它们分开”。
将它们分开会导致问题吗?
不一定,但这取决于您对问题的定义。如果你有一个天真或没有经验的开发人员在编写代码,他们可能会看着它说“嘿,你的代码不是 DRY,你太烂了。” 他们当然可能是错的,但你仍然必须向他们解释原因,所以这可能是个问题。
将它们放在一起并为 MVC 和 Web API 使用相同的模型会导致问题吗?
不,让我给出一个理由。MVC 和 WebAPI 的模型由不同的框架使用。例如,为了确保模型属性呈现为隐藏输入,您可以使用 [HiddenInput] 属性对其进行装饰。WebAPI 模型中没有这样的概念。同样,MVC 具有 Display、Remote 和其他您通常不会在 WebAPI 模型上使用的属性。
另一方面,WebAPI 模型可以使用在 MVC 中没有任何意义的 [DataContract] 和 [DataMember] 属性。您可以使用它们为 API 输出指定特殊名称(例如,重命名 XML 或 JSON 节点)。
虽然您可以在 MVC 和 WebAPI 中使用单个模型替身,但您最终可能会得到具有混合问题的模型:例如,用于 API 输出格式的 [DataMember] 属性和用于 MVC 表单视图的 [HiddenField] 属性渲染。人们可以将其视为污染的一种表现。
只要您的模型类是没有方法或智能行为的简单数据容器,拥有具有相同属性/模式的不同模型类并不违反 DRY。为什么?因为它允许您使用解决不同问题的不同属性来装饰这些类。
再说一次,如果您的模型不使用这些属性中的任何一个,并且您不打算这样做,那么将相同的模型加倍用于 MVC 和 WebAPI 是可以的。所以答案真的是,这取决于。
像往常一样,这类问题的答案是:“嗯,这取决于”
就我个人而言,我有一个专门用于数据层、我的宁静层和 Web 应用程序都引用的 poco 模型的类库。
在此之前我发现的唯一问题是 LinqToSql 生成的类(因此也可能是 EF)可以具有循环引用,当在 ApiController 类中序列化为 JSON 时,WebApi 会阻塞,最终进入无限循环。
我一见钟情说不,因为两者都有自己的目的。
mvc 中的 viewmodel 用于表示视图和对其处理的数据进行验证的属性。web api 似乎没有用于此目的。因此,即使我们有可以用作视图模型的实体,我们也总是有属性。
此外,这将使应用程序更难管理更改。
但是,如果您的应用程序相当小,您可以使用它。
我想说,如果你将不得不重新编码或复制并过去所有内容,如果你将它们分开,那么不要将它们分开。如果将它们分开意味着不复制任何内容,那么您可以安全且明智地分开。