【发布时间】:2012-02-17 03:58:59
【问题描述】:
假设我有可以检索 <Person> 对象集合的 WCF Web 服务。我的问题是我应该在哪里放置调用 Web 服务、控制器或模型的代码?我的第二个问题是我应该在我的模型文件夹中创建自己的 <Person> 类,还是只使用在 .NET 项目中添加服务引用时自动生成的类?
【问题讨论】:
标签: asp.net-mvc-3 model-view-controller .net-4.0
假设我有可以检索 <Person> 对象集合的 WCF Web 服务。我的问题是我应该在哪里放置调用 Web 服务、控制器或模型的代码?我的第二个问题是我应该在我的模型文件夹中创建自己的 <Person> 类,还是只使用在 .NET 项目中添加服务引用时自动生成的类?
【问题讨论】:
标签: asp.net-mvc-3 model-view-controller .net-4.0
通常我会让控制器使用 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 模式本身未规定的其他类。
这就是我的评论的全部含义。再一次,我意识到这不是最好的措辞。对不起。
【讨论】:
DataModel 到ViewModel 转换器/转换器,并且“转换器”类不是模型、视图或控制器。对困惑感到抱歉。 @qin:通常我让控制器通过某种抽象出实际数据库的Repository 加载数据。
从 Controler 调用 WCF 是真的。如果你调用你的模型依赖于服务的服务 insede 模型,这对 MVC 来说不是很好的用法。模型不应该依赖于服务。从控制器调用最佳选择
【讨论】:
这实际上取决于您在检索数据后要如何处理数据。
如果您打算将其放入数据库中,则不应发生在控制器或模型中,而应发生在较低层中。
如果您打算立即将其显示在页面上 - 即,从服务中获取数据并将其添加到您的模型中 - 您可以从控制器调用服务,但我个人的偏好是将调用移至另一个可以处理所有通信混乱而不会使控制器混乱的类,尤其是因为您可能需要从其他控制器中执行此操作。
与模型没有显式相关的代码(例如验证,即使在某些情况下也是如此)不属于模型,以及没有明确用于将模型移入和移出视图的代码,或者调用较低层对模型进行进一步处理,不属于控制器。
【讨论】: