控制器/模型上的 MVC 设计查询

Posted

技术标签:

【中文标题】控制器/模型上的 MVC 设计查询【英文标题】:MVC Design query on Controller/Models 【发布时间】:2015-05-13 07:38:48 【问题描述】:

关于 EF 的一些查询。

问题 -

    直接使用数据库上下文对象的方法应该是控制器类或模型的一部分吗? ContactManagerContext.cs(我将其视为 DAL 层?)我的假设是否正确? ContactManager 类应该放在哪里?型号还是 DAL?它目前是 Model 类的一部分。 将添加更多问题

这就是我构建类的方式 - 模型和控制器。

请查看并评论代码结构是否正确以及如何改进。

模型类(Contact.cs):

using Contact_Manager.DAL;

namespace Contact_Manager.Models


public class Contact

    [Key]
    public int ContactId  get; set; 
    [Required, MaxLength(100)]
    public string FirstName  get; set; 
    [Required, MaxLength(100)]
    public string LastName  get; set; 
    public string EMail  get; set; 
    public string Phone  get; set; 
    public string BusinessName  get; set; 


public class ContactManager

    ContactContext db = new ContactContext();

    public IEnumerable<Contact> ContactList(int? selectedContact)
    

        IQueryable<Contact> contacts = db.Contacts;

        return contacts.ToList();

    

    


ContactManagerContext.cs (DAL)
------------------------------

using System.Data.Entity;
using System.Linq;
using Contact_Manager.Models;


namespace Contact_Manager.DAL

    public class ContactContext : DbContext
    

        public ContactContext()
            : base("ContactMgrDBContext")
        
            Database.SetInitializer<ContactContext>(new      DropCreateDatabaseIfModelChanges<ContactContext>());
        

        public DbSet<Contact> Contacts  get; set; 

    


ContactController.cs(控制器类):

using System.Web.Mvc;
using System.Linq;
using Contact_Manager.Models;

namespace Contact_Manager.Controllers

    public class ContactController : Controller
    

        //
        // GET: /Contact/

        public JsonResult ContactList()
        

            ContactManager cMgr = new ContactManager();

            IEnumerable<Contact> contactList = cMgr.ContactList(0);

            //var contactsJson = JsonConvert.SerializeObject(contacts.ToList());

            return Json(contactList, JsonRequestBehavior.AllowGet);

        

        public ActionResult Index()
        
            return View();
        



    

【问题讨论】:

当你提到命名空间时,你在谈论很多类 不知道为什么我看不到昨天的答案之一。我喜欢这个答案,并将其标记为我的问题的答案。不幸的是,我不记得是谁回答的。但我会等待一个合适的答案,然后相应地标记它。 【参考方案1】:

MVC 模式是最容易被误解的架构模式之一。

此外,如果它在 UI 中经常使用,它是一种更通用的方法。必须将常用用法与处理不同职责的目的分开。

解释 MVC 的最佳方式是将其视为一种模式,将职责和它们之间的协作分离在一个层中。所以你可能在 UI 层有 MVC,但在 DAO 层也有。

例如,在 UI 层中,模型对象是保存 UI 组件状态的对象。 View-Object 是 UI 组件,它拥有基于模型对象状态绘制自身的逻辑。控制器从不同来源检索事件并协调模型和视图之间的通信。

在 DAO 层中,模型对象是数据库状态的一部分(通常是一行)。想想一个 ORM 对象。视图对象是“下一个”层的表示。控制器是协调映射和更改的 DAO。

一般来说,您需要拥有状态(模型)的东西。然后你需要一个状态的外部表示来发布(视图)避免耦合到状态。毕竟,您必须让 BEHAVIOR(控制器)编排更改和映射。

将 MVC 视为层的方法可能适用于小型项目。在较大的项目中,您将面临可维护性问题,因为您肯定有超过三个职责。如果你只有三层,你将混合缺乏单一职责原则的职责。

回答您的问题:

    没有。为此编写一个单独的 DAO。控制器和/或模型应该使用它。 没有。见 1。 如果我们谈论 MVC,控制器就是控制器。没有其他的。如果我们谈论层,控制器似乎混合了 UI 的职责,模型可能是 DAO。所以分配是模棱两可的。

【讨论】:

【参考方案2】:

您可以在控制器部分中创建三层模型。 Controller将是最高层,它会和BL“对话”等等。

模型应该简单而干净。

【讨论】:

以上是关于控制器/模型上的 MVC 设计查询的主要内容,如果未能解决你的问题,请参考以下文章

什么是MVC设计模式,为什么使用MVC?

胖模型、瘦控制器和 MVC 设计模式

设计模式MVC模式

设计模式(26)-MVC 模式

传统的MVC设计模式

MVC - 使用哪种设计模式将请求有效负载从控制器转换为模型