【问题标题】:Should web service be called inside a Model class in MVC framework?是否应该在 MVC 框架的 Model 类中调用 Web 服务?
【发布时间】:2012-02-17 03:58:59
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc-3 model-view-controller .net-4.0


    【解决方案1】:

    通常我会让控制器使用 WCF 服务来加载数据,有时也可以是模型。在更复杂的应用程序中,您可能需要将 WCF 返回的内容(数据传输对象)转换为模型,这确实超出了“MVC”模式。


    您可能想查看Nerd Dinner 示例,看看他们是如何组织代码的。它旨在成为结构良好的 MVC3 应用程序的“真实世界”示例。

    Hanselman 还汇总了几个不同的 NerdDinner 分叉,它们进行了不同风格的数据访问on his blog


    @Splash-X 的代码 sn-p

    我在“不属于 MVC 模式”的评论中试图表达的是,有时 DataModel(DB 或 WCF 返回的内容)与 ViewModel(您发送到 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
                };
        }
    }
    

    我的任何评论都是为了暗示模型之间的“转换”不是由 MVC 模式决定的。或者更一般地说,不要仅仅因为您遵循 MVC 就意味着您可以拥有 3 种类类型。并非一切都是模型、视图或控制器。 Controller 可以并且将使用 MVC 模式本身未规定的其他类。

    这就是我的评论的全部含义。再一次,我意识到这不是最好的措辞。对不起。

    【讨论】:

    • 当您需要转换为其他内容以将其发送到视图(例如:为字段验证添加元标记或组合多个模型)时,我们将其称为 ViewModel。我不会说使用 ViewModel 超出了 MVC 模式。在很多情况下,您不希望将数据库实体或 Web 服务实体作为模型。
    • 一般来说,你的数据访问代码在MVC模式中应该放在哪里?
    • @Splash-X :我想我说的不是很好。我的意思是控制器会调用某种DataModelViewModel 转换器/转换器,并且“转换器”类不是模型、视图或控制器。对困惑感到抱歉。 @qin:通常我让控制器通过某种抽象出实际数据库的Repository 加载数据。
    • MVC 中的“M”不代表“数据模型”,它代表“模型”。模型可以是任何类型的模型(视图模型、数据模型、动态或匿名模型)。要说从源(数据库、Web 服务、内存等)获取数据并基于该数据创建不同的模型以发送到视图与 MVC 模式不匹配,这是一个大胆的说法。如果是这种情况,为什么会有匿名或动态模型?
    • 我在答案的末尾添加了一些文本,并带有一个代码片段,以更好地解释我所说的“不是 MVC 模式的一部分”的意思。事后看来,这是一个措辞不佳的评论,我应该省略它。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这实际上取决于您在检索数据后要如何处理数据。

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

      如果您打算立即将其显示在页面上 - 即,从服务中获取数据并将其添加到您的模型中 - 您可以从控制器调用服务,但我个人的偏好是将调用移至另一个可以处理所有通信混乱而不会使控制器混乱的类,尤其是因为您可能需要从其他控制器中执行此操作。

      与模型没有显式相关的代码(例如验证,即使在某些情况下也是如此)不属于模型,以及没有明确用于将模型移入和移出视图的代码,或者调用较低层对模型进行进一步处理,不属于控制器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2014-02-19
        • 2017-05-01
        • 2017-02-12
        相关资源
        最近更新 更多