我正在努力学习C#和MVC,并正在开展一个帮助我这样做的项目。作为其中的一部分,我正在尝试创建用户注册并登录到我的网站。我正在使用实体框架,并且我正在尝试遵循我所知道或遇到的所有最佳实践,并且我认为我有点混淆了一些事情。
我创建了一个表示层,一个DataLayer和一个BusinessLayer。这基本上给我留下了一个问题,因为我不能做一些看似显而易见的事情,因为这将是一个循环依赖,因为这是一件坏事,无论如何我想知道我是否正在以正确的方式进行此事。
在我的表示层中,我已经放置了我的ViewModel和Controller。
在我的DataLayer中是我的所有EF类和模型。
我也有一个BusinessLayer,但在这里什么都没有(不是100%应该在这里进行)
我的表示层显然依赖于我的DataLayer,但是将数据从PresentationLayer中的ViewModel传递回DataLayer中的数据模型以更新数据库的最佳方法是什么?在View中,用户基本上会输入登录信息,然后需要将其发送到DataLayer中的Entity,然后使用Entities EF访问数据库。我不能将我的表示层添加为我的DataLayer的依赖项,因为这会创建循环依赖。
我已经阅读过关于自动播放器但是不确定这是否正确或者逻辑应该去哪里,它应该在模型中还是在单独的类中以及在哪个层中?我也尝试过使用Unity和依赖注入做一些事情,但我认为我现在正在混淆实际需要什么,并将我正在阅读的内容应用到我实际上要做的事情上。我可以通过将所有内容放在一个项目中来实现这一点,但显然我正试图从设计的角度来做这件事。
答案 0 :(得分:1)
从我的ViewModel传递数据的最佳方法是什么? PresentationLayer返回DataLayer中的数据模型进行更新 数据库?
使用 Automapper 不会阻止我们获得循环依赖。为方便起见,将一个映射到另一个对象。
只要我们不在 DataLayer 中实例化 ViewModel 类(我们不应该需要),我们不会有循环依赖。
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);
}
答案 1 :(得分:0)
要将数据从视图传递到控制器,您有三个选项: 1.使用强大的模型打字 2.使用FormCollection对象(不推荐) 3.使用参数
关于如何将参数从View传递到Controller的好教程:
https://www.codeproject.com/Articles/639709/Getting-Data-From-View-to-Controller-in-MVC