Asp.net mvc 如何在ASP.NET MVC中将复杂的ViewModel传递给服务层?

Asp.net mvc 如何在ASP.NET MVC中将复杂的ViewModel传递给服务层?,asp.net-mvc,service-layer,Asp.net Mvc,Service Layer,假设我有用于用户注册的RegisterModel和一些实现IUserService的UserService public interface IUserService { User CreateUser(User newUser); } [HttpPost] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) {

假设我有用于用户注册的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映射到用户对象的逻辑应该在哪里呢。服务甚至不知道是否存在您可能在GUI(ASP.NET MVC)层中定义的视图模型。服务与域模型一起工作。我个人习惯于在视图模型和模型之间进行映射,反之亦然,所以这个逻辑进入映射层。

那么服务层在这里做什么呢?如果controller处理从存储库中检索模型类并使用AutoMapper更新它们,那么服务层在这里做什么?@LukLed,服务层公开您可以使用模型执行的业务操作。这些业务操作可以在许多不同的应用程序中重用:ASP.NETMVC、WinForms、WPF、公开为WCF服务等等。。。视图模型只是满足给定视图特定需求的临时对象。它们只是真实模型的一种表示。视图模型不是服务层应该考虑的问题。它们对于给定的应用程序来说太具体了。@Darin Dimitrov:我的问题是,它在这里做什么?当我们创建用户时,您能给出一个在这种特定情况下控制器和服务之间通信的示例吗?@LukLed,这里有一个示例:控制器操作从视图接收视图模型,它使用映射层(在我的例子中是AutoMapper)将此视图模型映射到模型,然后调用传递此模型的服务方法。因此,这里需要注意的重要一点是,控制器仅通过视图模型与视图通信:它将视图模型接收到视图,并将视图模型传递到视图。我就是这么做的。@eldar,我认为这两种方法都很好。顺便说一句,对于我来说,EF模型不应被视为模型(除非您使用代码优先的方法)=>这些模型只是由辅助数据库传输对象自动生成的,应该放入CRUD存储库,而不是服务,因为它们经常被您使用的特定数据访问技术(在本例中为EF)污染/相关。