C# ASP.NET MVC设计问题

C# ASP.NET MVC设计问题,c#,asp.net,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc 3,Model和ViewModel之间有什么区别?我应该两个都用,还是最好跳过其中一个?谁从数据库中获取数据 我想知道从数据库中获取数据的最佳/正确方法是什么 一种选择是使用DAL(数据访问层)并在每个控制器中实例化, 使用它填充viewmodels,如: var viewmodel = Dal.GetArticles(); 另一种选择是让模型本身从数据库中获取信息: var model = new ArticlesModel(); model.GetArticles(); public voi

Model和ViewModel之间有什么区别?我应该两个都用,还是最好跳过其中一个?谁从数据库中获取数据

  • 我想知道从数据库中获取数据的最佳/正确方法是什么

  • 一种选择是使用DAL(数据访问层)并在每个控制器中实例化, 使用它填充viewmodels,如:

    var viewmodel = Dal.GetArticles();
    
    另一种选择是让模型本身从数据库中获取信息:

    var model = new ArticlesModel();
    model.GetArticles();
    
    public void GetArticles()
    {
    var context = new DbContext();
    _articles = context.Articles
    }
    
    另一个类似的选择是有一个静态DAL,这样您可以在每个模型中访问它, 因此,每个模型都有一个使用静态DAL类(其中包含一个DbContext类以访问数据库)获取数据的方法


    因此,一般的问题是,模型本身是否需要从数据库中获取数据,或者控制器本身是否可以访问DAL。

    模型表示您喜欢数据所在的结构,而不关心可能使用数据的视图。模型的意图纯粹是表示结构

    模型可能包含与使用它的视图无关的属性

    视图模型的设计考虑了视图。视图模型适用于与视图的1对1关系。视图模型仅包含它所要用于的视图所需的基本字段和属性


    通常,您会让您的控制器联系存储库(在您的示例中是DAL),获取数据,然后用结果填充模型或视图模型,并将其发送到视图。

    当有人正在编写更有用的答案时,我将快速阐述您的观点

    型号
    是要显示的数据。

    通常,您会希望使用对象关系映射,以便大多数业务对象类与数据库表相对应,而不必手动构造查询

    有很多ORM解决方案可用,包括EntityFramework、NHibernate和(即将消亡的)LINQtoSQL

    还有一个很棒的叫做微ORM的东西,如果大型框架对您的解决方案感到不必要的臃肿,您可能会喜欢它

    确保你了解它们之间的区别

    DAL在.NET中比。

    (尽管在实践中,您的解决方案很可能是这两种方法的混合,但关键是一如既往地保持平衡。)

    我的建议是,在ORM允许的情况下,尽量保持您的模型,只要这不会给调用代码增加额外的复杂性

    只要有可能(任何规则都有例外!),这些对象就不应该绑定到特定的数据库或ORM实现

    如果需要,将代码迁移到另一个ORM只需重写数据访问层即可。
    但是,您应该了解,这不是分离DAL的主要原因

    <> P>你很可能不想在项目中间改变一个ORM,除非你最初的选择真的不适合这个目标,或者你突然得到了100000的用户的牵引力,你的ORM无法处理它。strong>一开始为此进行优化是非常愚蠢的,因为它会分散你的注意力,使你无法创建一个伟大的产品,而这个产品甚至可以吸引你正在优化的点击率的一小部分。(免责声明:我以前就走过这条路。)

    相反,DAL的好处是,数据库访问始终是显式的,并限制在您希望访问的特定位置。例如,接收到要显示的模型对象的视图不会试图从数据库加载某些内容,因为实际上这是控制器的工作

    通常,将业务逻辑、表示逻辑和数据库逻辑等分开也是很好的。它通常会产生更好、更少的bug代码。另外:您可能会发现很难对依赖于从数据库加载的对象的任何代码进行单元测试。另一方面,使用LINQ创建一个“伪”内存数据访问层是微不足道的

    请再次记住,此规则也有例外,例如许多ORM生成的惰性属性,即使在视图中调用,也会在运行中加载相关对象。所以,重要的是,您应该在知情的情况下决定何时允许数据访问以及为什么允许数据访问。Syntaxic sugar可能很有用,但如果您的团队不知道从ORM加载20000个对象的性能影响,这将成为一个问题

    在使用任何ORM之前

    在活动记录样式的对象和DAL之间进行选择主要取决于品味、.NET中的常见习惯、团队习惯以及DAL最终可能被取代的可能性

    最后,
    ViewModel
    s是另一种野兽。

    试着这样想:

  • 视图中不应该有比
    if-then-else
    更复杂的逻辑
  • 然而,在展示事物时往往有一些复杂的逻辑。
    考虑分页、排序、在一个视图中组合不同的模型、理解UI状态
  • 这些是视图模型可以处理的事情。
    在简单的情况下,它只是将几个不同的模型组合成一个“视图模型”:

    class AddOrderViewModel {
        // So the user knows what is already ordered
        public IEnumerable<Order> PreviousOrders { get; set; }
        // Object being added (keeping a reference in case of validation errors)
        public Order CurrentOrder { get; set; }
    }
    
    类AddOrderViewModel{
    //因此,用户知道已经订购了什么
    公共IEnumerable PreviousOrders{get;set;}
    //正在添加的对象(在验证错误时保留引用)
    公共秩序当前秩序{get;set;}
    }
    
    模型只是数据,控制器组合数据并引入一些逻辑来描述要在视图模型中显示的数据,而视图只是渲染视图模型

    视图模型也可以作为一种文档。他们回答了两个问题:

  • 我可以在视图中使用哪些数据?
  • 什么数据
    class AddOrderViewModel {
        // So the user knows what is already ordered
        public IEnumerable<Order> PreviousOrders { get; set; }
        // Object being added (keeping a reference in case of validation errors)
        public Order CurrentOrder { get; set; }
    }
    
    public class Product
    {
    ...............
    }
    
    public class Category
    {
    ...........
    }
    
    public class ProductViewModel
        {
            public ProductViewModel(List<Product> products, List<Category> categories)
            {
                this.Products = products;
                this.Categories = categories;
            }
    
            public List<Product> Products { get; set; }
            public List<Category> Categories { get; set; }
    
        }