我应该在ViewModel和DomainModel之间有一层吗?

网民

我有我的域模型(用于与EF结合并用于映射到数据库):

public class Category : BaseEntity
{
    public string Name { get; set; }
    public Category ParentCategory { get; set; }
    //Code removed for brevity
}

然后,我有一个共享控制器来在我的视图中使用此菜单显示类别菜单:

@Html.Action("GetCategoryMenu", "Shared")

控制器

[OutputCache(Duration = int.MaxValue, VaryByParam = "none")]
public ActionResult GetCategoryMenu()
{
    var viewModel = new CategoryMenuViewModel
    {
        Categories = _categoryService.Get().Where(c => c.ParentCategory != null && c.ParentCategory.Id == WebsiteContext.CurrentWebsite.CategoryId)
    };

    return PartialView("_CategoryMenu", viewModel);
}

和ViewModel:

public class CategoryMenuViewModel
{
    public IEnumerable<Category> Categories { get; set; }
}

我现在的问题是,如果我实现了像category.GetUrl()在我看来那样的用途,将会去哪儿?域模型是类似这样的正确位置吗?

GetUrl()将运行一些逻辑并根据某些条件返回一个Url。我从视图本身看到将其嵌入到超链接中。它会按类别运行,实际上只是获得一个Url,以防日后我想更改生成它们的方式。

本质上,我试图在局部视图中实现此目的以呈现类别菜单:

@foreach (Category category in Model.Categories)
{
    <li class="list-group-item clearfix">
        <a href="@category.GetUrl()"><i class="fa fa-angle-right"></i> @category.Name</a>
    </li>
}

我现在正在寻找最佳实践建议,因为我想确保自己正确理解MVC模式,因为我对将GetUrl()方法放置到域模型中有一种奇怪的感觉,但我不知道为什么。

克里斯

基本思想是以一种方式创建应用程序,使您可以替换彼此之上的层而不接触基础层。一个典型的例子是三层体系结构这意味着您的GUI仅访问逻辑层(业务模型),而逻辑层仅访问数据库层(实体框架)。由于Entity Framework的设计方式,最后一部分有点麻烦:当您将业务逻辑放入实体类本身时,EF已经将逻辑层与数据层混合在一起。

但是,对于上两层,您应该尊重这种分离。执行GUI任务的方法,例如,GetUrl不应属于域类。例如,将来可能需要更改GUI,而URL现在具有不同的布局。然后,您需要更改域模型,这不是应该的。

正确的方法是创建其他视图模型,然后将所需的属性从业务对象映射到视图模型。但是,您确实想避免这种情况,您可能会考虑在GUI项目中为业务类定义扩展方法。

附带说明:我已经完全按照您的建议进行了操作,即使用通过Entity Framework获得的业务对象作为视图模型。注意这带来的限制,尤其是在将更改保存回EF方面。即使它们是实体,您通常仍需要映射已发布到您的对象,因为它们是由MVC模型绑定程序实例化的,并且不会通过EF上下文检索,即它们无法保存为现有对象的更新版本。 。解决此问题的一种方法可能是创建自定义模型联编程序,但是我确实认为最好通过创建视图模型和映射来实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在哪一层进行多层MVC日志记录

来自分类Dev

为什么我们不应该在同一层使用多个激活功能?

来自分类Dev

我应该在表示层中抛出异常吗?

来自分类Dev

DDD:我应该在哪一层放置Web服务(同时用于服务请求和外部引用的Web引用)?

来自分类Dev

我应该在uml类图中描述Web应用程序的哪一层,仅模型或模型+控制器都应

来自分类Dev

是否应该在ViewModel(UI层)和域Model(业务层)中使用相同的Enums定义?

来自分类Dev

.ssh的最佳做法?我应该在一段时间内禁用所有root登录和用户密码访问权限吗?

来自分类Dev

我应该在Model或viewModel中放置“必需的”数据注释吗?

来自分类Dev

我们应该在Service,intentservice,runnable和thread之间使用哪一个?

来自分类Dev

我应该在训练集中存在的所有对象上标记和训练吗(yolo darknet)

来自分类Dev

我应该在所有脚本上都添加* .sh和* .rb文件扩展名吗?

来自分类Dev

如果我有主房间和备用房间,它们应该在不同的桌子中吗?

来自分类Dev

我应该在使用 Firebase 和 Sqlite 的 Android 项目中创建一个 contentprovider 吗?

来自分类Dev

React Native&Redux我应该在每个场景/路线上有一个商店吗?

来自分类Dev

我们应该在不同的调用之间重用cublasHandle_t吗?

来自分类Dev

我应该在邮件之间保持smtp connecton打开吗?

来自分类Dev

我应该在指令和服务之间传递数据吗?

来自分类Dev

我应该在不同的SATA控制器之间分配驱动器吗?

来自分类Dev

我应该在类或重组程序之间传递GUI输入的变量吗?

来自分类Dev

SQLAlchemy:我应该在两个查询之间提交更新吗?

来自分类Dev

我应该在admin和api之间在laravel中重用控制器吗?或让我的管理员使用我的API?

来自分类Dev

我应该在我的 .htaccess 文件中删除或添加一些东西吗?

来自分类Dev

我应该声明哪一层枚举?

来自分类Dev

我应该在Java HashMap中为String键覆盖equals()和hashCode()吗?

来自分类Dev

我应该在前端和后端任务上拆分用户故事吗?

来自分类Dev

我应该在域测试中继续使用模拟和存根吗?

来自分类Dev

复合设计模式:我应该在父接口中插入add()和remove()吗?

来自分类Dev

我应该在类实现中使用getter和setter吗?

来自分类Dev

我应该在GET和POST请求中转义字符吗?

Related 相关文章

  1. 1

    我应该在哪一层进行多层MVC日志记录

  2. 2

    为什么我们不应该在同一层使用多个激活功能?

  3. 3

    我应该在表示层中抛出异常吗?

  4. 4

    DDD:我应该在哪一层放置Web服务(同时用于服务请求和外部引用的Web引用)?

  5. 5

    我应该在uml类图中描述Web应用程序的哪一层,仅模型或模型+控制器都应

  6. 6

    是否应该在ViewModel(UI层)和域Model(业务层)中使用相同的Enums定义?

  7. 7

    .ssh的最佳做法?我应该在一段时间内禁用所有root登录和用户密码访问权限吗?

  8. 8

    我应该在Model或viewModel中放置“必需的”数据注释吗?

  9. 9

    我们应该在Service,intentservice,runnable和thread之间使用哪一个?

  10. 10

    我应该在训练集中存在的所有对象上标记和训练吗(yolo darknet)

  11. 11

    我应该在所有脚本上都添加* .sh和* .rb文件扩展名吗?

  12. 12

    如果我有主房间和备用房间,它们应该在不同的桌子中吗?

  13. 13

    我应该在使用 Firebase 和 Sqlite 的 Android 项目中创建一个 contentprovider 吗?

  14. 14

    React Native&Redux我应该在每个场景/路线上有一个商店吗?

  15. 15

    我们应该在不同的调用之间重用cublasHandle_t吗?

  16. 16

    我应该在邮件之间保持smtp connecton打开吗?

  17. 17

    我应该在指令和服务之间传递数据吗?

  18. 18

    我应该在不同的SATA控制器之间分配驱动器吗?

  19. 19

    我应该在类或重组程序之间传递GUI输入的变量吗?

  20. 20

    SQLAlchemy:我应该在两个查询之间提交更新吗?

  21. 21

    我应该在admin和api之间在laravel中重用控制器吗?或让我的管理员使用我的API?

  22. 22

    我应该在我的 .htaccess 文件中删除或添加一些东西吗?

  23. 23

    我应该声明哪一层枚举?

  24. 24

    我应该在Java HashMap中为String键覆盖equals()和hashCode()吗?

  25. 25

    我应该在前端和后端任务上拆分用户故事吗?

  26. 26

    我应该在域测试中继续使用模拟和存根吗?

  27. 27

    复合设计模式:我应该在父接口中插入add()和remove()吗?

  28. 28

    我应该在类实现中使用getter和setter吗?

  29. 29

    我应该在GET和POST请求中转义字符吗?

热门标签

归档