2017-04-10 88 views
0

我想更好地学习C#和MVC,并且正在开发一个项目来帮助我这样做。作为这一部分,我尝试创建一个用户注册并登录到我的网站。我正在使用实体框架,并试图遵循我所知道或遇到的所有最佳实践,并且我认为我有点混淆了几件事情。从ViewModel传递数据到DataModel

我已经创建了一个表示层,一个DataLayer和一个BusinessLayer。这基本上给我留下了一个问题,因为我不能做显而易见的事情,因为这是一个循环依赖,因为无论如何,这是一件坏事,我想知道我是否正在以正确的方式进行。

在我的表示层我已经把我的ViewModel和控制器。

在我的DataLayer是我所有的EF类和模型。

我也有一个BusinessLayer但在这里什么都没有,但(没有100%什么应该在这里还)

我表示层显然是依赖于我的数据层,但什么是从传递数据的最佳方式我的ViewModel在PresentationLayer中返回DataLayer中的数据模型来更新数据库?在View中,用户将基本上输入登录信息,然后需要将其发送到DataLayer中的实体,然后使用Entities EF访问数据库。我不能添加我的表示层作为依赖到我的DataLayer,因为这会创建一个循环依赖。

我已阅读过有关automapper的内容,但不确定这是否正确,或者该逻辑应该放在哪里,应该放在Model还是单独的类中,以及放在哪个Layer中?我也尝试过使用Unity和依赖注入来做一些事情,但是我认为现在混淆了实际需要的内容,并将我正在阅读的内容应用于我实际正在尝试做的事情。我可以通过将所有内容放在一个项目中来实现这一目标,但显然我正在从设计的角度来做这件事。

回答

1

什么是通过从我的视图模型中的数据 表示层回在数据层的数据模型,以更新 数据库的最佳方式?

使用Automapper不会从具有循环依赖阻止我们。将一个映射到另一个映射只是为了方便我们。

只要我们不要实例视图模型类中数据层(我们不应该需要),我们不会有循环依赖。

Here就是这样的例子 - 通过调用UserService将数据从ViewModel传递给DataModel。

[HttpPost] 
public async Task<ActionResult> Create(UserCreateUpdateModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new User 
     { 
     UserName = model.UserName, 
     FirstName = model.FirstName, 
     LastName = model.LastName 
     }; 

     await _userService.AddUserAsync(user); 
     return RedirectToAction("List"); 
    } 
    return View("Create", model); 
} 
+0

注意这个类是使用依赖注入为好。在那里有许多好的nuget包。我喜欢的是SimpleInjector。这将意味着你不是'新兴'服务,而是他们被注入,这将导致更多的可测试代码 –

+0

我同意。我使用Autofac,但您可以使用任何IoC容器;他们都是伟大的容器。上面的代码是单元可测试的 - [这里](https://github.com/WinLwinOoNet/AspNetMvcActiveDirectoryOwin/blob/master/src/Presentation/AspNetMvcActiveDirectoryOwin.Web/Areas/Administration/Controllers/UsersController.cs#L96)是实现,和[这里](https://github.com/WinLwinOoNet/AspNetMvcActiveDirectoryOwin/blob/master/src/Tests/AspNetMvcActiveDirectoryOwin.Web.Tests/Controllers/UserControllerTests.cs#L308)是单元测试。 – Win

+0

是的,您的样品很棒......只是指出了使用依赖注入(DI)和控制反转(IoC) –