应该在MVC框架的Model类中调用Web服务吗?

问题描述:

假设我有WCF Web服务,它可以检索<Person>对象的集合。我的问题是我应该在哪里放置代码来调用Web服务,控制器或模型?我的第二个问题是我应该在我的模型文件夹中创建自己的<Person>类,还是只使用在.NET项目中添加服务引用时自动生成的类?应该在MVC框架的Model类中调用Web服务吗?

通常我会让Controller使用WCF服务来加载数据,有时候也可能是Model。在更复杂的应用程序中,您可能需要将WCF返回的内容(数据传输对象)转换为您的模型,这实际上不属于“MVC”模式。


您可能要审查Nerd Dinner例子,看看他们是如何他们的代码组织。它旨在成为一个结构相当完善的MVC3应用程序的“真实世界”示例。

Hanselman还对几种不同的NerdDinner叉进行了总结性审查,这些叉做了不同风格的数据访问on his blog


代码段@飞溅-X

我是想在我的“不MVC模式的一部分”,以获得跨越评论说,有时数据模型(什么DB或WCF回报)是不一样的视图模型(您发送到View),所以有时你可能需要的东西的模型之间进行转换,如:

public interface ITransformer<out To, in From> 
    where To : class 
{ 
    To Transform(From instance); 
} 

public class SomeDataToSomeViewModelTransformer : ITransformer<SomeViewModel, SomeDataModel> 
{ 
    public SomeViewModel Transform(SomeDataModel instance) 
    { 
     return new SomeViewModel 
      { 
       InvitationId = instance.Id, 
       Email = instance.EmailAddress, 
       GroupId = instance.Group.Id 
      }; 
    } 
} 

任何我的评论是为了暗示的事“转型“之间的模式不是dic按照MVC模式进行设置。或者更一般地说,不要觉得仅仅因为你遵循MVC就意味着你可以只有只有有3个类的类型。不是一切是模型,视图或控制器。控制器可以并将使用其他类未被MVC模式本身规定的类。

这就是我的意思。我再次意识到这不是最好的措辞。抱歉。

+0

当您需要转换为其他内容以将其发送到视图(例如:为字段验证或组合多个模型添加元标记)时,我们称该视图模型为ViewModel。我不会说使用ViewModel不在MVC模式中。有很多情况下,您不希望数据库实体或Web服务实体作为您的模型。 – 2012-02-17 04:28:17

+0

一般来说,你的数据访问代码应该在MVC模式中? – nobody 2012-02-17 04:56:21

+0

@ Splash-X:我猜我没说得那么好。我的意思是,控制器会调用某种'DataModel'到'ViewModel'变压器/转换器,而“变压器”类不是模型,视图或控制器。对困惑感到抱歉。 @qin:通常我有Controller通过某种'Repository'加载数据,从而抽象出实际的数据库。 – CodingWithSpike 2012-02-17 15:09:07

Controler调用WCF是正确的。如果你调用你的模型所依赖的服务insede模型,这对于MVC来说并不好用。模型不应该依赖于服务。从控制器呼叫最佳选择

这实际上取决于您在检索数据后对数据所做的操作。

如果您打算将它放在数据库中,它不应该发生在控制器或模型中,而应发生在较低层。

如果您计划立即在网页上显示它 - 即从服务获取数据并将其添加到您的模型 - 您可以从您的控制器调用服务,但我个人的偏好是将该呼叫转移到另一类可以处理所有的通信混乱而不会混淆控制器,特别是因为您可能需要从其他控制器执行此操作。

与模型没有明确关联的代码 - 比如验证,甚至仅在某些情况下 - 不属于模型,并且代码不能明确地将模型导入和导出视图,或者调用较低层来执行模型的进一步处理,不属于控制器。