【问题标题】:How to pass complex ViewModel to Service Layer in ASP.NET MVC?如何将复杂的 ViewModel 传递给 ASP.NET MVC 中的服务层?
【发布时间】:2011-06-30 12:12:53
【问题描述】:

假设我有用于用户注册的 RegisterModel 和一些实现 IUserService 的 UserService

public interface IUserService
{
   User CreateUser(User newUser);
}


[HttpPost]
public ActionResult Register(RegisterModel model)
{
            if (ModelState.IsValid)
            {

                // ... logic for newuser

                User user = _userService.CreateUser(newuser);

               _authenticationService.SetAuthenticatedUser(user);

                return RedirectToRoute("Homepage");
            }

            return View(model);
        }

鉴于 RegisterModel 可能非常复杂,将 RegisterModel 映射到 User 对象的逻辑应该在哪里

【问题讨论】:

    标签: asp.net-mvc service-layer


    【解决方案1】:

    您永远不会将视图模型传递给服务。服务甚至不知道您可能在 GUI (ASP.NET MVC) 层中定义的视图模型的存在。服务与域模型一起工作。我个人使用AutoMapper在视图模型和模型之间进行映射,反之亦然,所以这个逻辑进入映射层。

    【讨论】:

    • 那么服务层在这里做什么呢?如果控制器处理从存储库中检索模型类并使用 AutoMapper 更新它们,那么服务层在这里做什么?
    • @LukLed,服务层公开了您可以使用模型执行的业务操作。这些业务操作可以在许多不同的应用程序中重用:ASP.NET MVC、WinForms、WPF、公开为 WCF 服务……视图模型只是临时对象,用于满足给定视图的特定需求。它们只是真实模型的代表。视图模型不是服务层应该打扰的东西。它们过于特定于给定的应用程序。
    • @Darin Dimitrov:我的问题是,它在这里做什么?当我们创建用户时,您能否举例说明在这种特定情况下控制器和服务之间的通信?
    • @LukLed,这是一个示例:控制器操作从视图接收视图模型,它使用映射层(在我的情况下为 AutoMapper)将此视图模型映射到模型,然后调用服务方法传递它这个模型。所以这里要注意的重要一点是控制器只通过视图模型与视图通信:它接收视图模型到视图,并将视图模型传递给视图。我就是这样做的。
    • @eldar,我认为这两种方法都很好。顺便说一句,EF 模型不应该被视为模型(除非您使用 Code First 方法)=> 这些只是由辅助数据库传输对象自动生成,这些对象应该进入 CRUD 存储库而不是服务,因为它们经常被污染/与您正在使用的特定数据访问技术相关(在本例中为 EF)。
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多