【问题标题】:When should I write code in the controller vs. model?我什么时候应该在控制器和模型中编写代码?
【发布时间】:2013-08-19 10:04:22
【问题描述】:

毫无疑问,我知道控制器和模型的用途。但是,我能够编写与我的数据库交互的代码,例如在控制器或模型上将用户添加到表中。我应该在什么时候在控制器和模型中编写代码?尽管两者都有效,但哪种方式更有条理或更实用。如果答案模棱两可,您能否发布示例?谢谢

【问题讨论】:

  • “毫无疑问,我知道控制器和模型的用途”......有点让这个问题变得多余,不是吗?

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

为此,您应该添加一个逻辑层或逻辑类。控制器应该确定想要做什么和可以做什么,将它们按正确的方向(逻辑层)洗牌,然后确定在逻辑之后向用户显示什么。将逻辑放在单独的层将有助于保持控制器精简并促进代码重用。

在域核心中,我们只有具有属性的模型。所有逻辑都在不同的层中执行,除了返回以某种格式连接的字段的属性。

【讨论】:

  • 非常好的答案,正如您所说,您的方法促进了 DRY 以及添加其他机制的能力,例如单例会话/应用程序存储以及工作模式(如果您愿意的话)。我添加了我的 0.10 美元,并进行了加强您对控制器角色的断言的编辑,希望您不介意。
【解决方案2】:

访问数据库的代码应该在服务层,而不是保存在控制器或模型中。

Accessing Database Entities from Controller

这是我对上述问题的回答,您也可以阅读其他回答,为什么您应该保留在单独的层中。

namespace MyProject.Web.Controllers
{
   public class MyController : Controller
   {
      private readonly IKittenService _kittenService ;

      public MyController(IKittenService kittenService)
      {
         _kittenService = kittenService;
      }

      public ActionResult Kittens()
      {
          // var result = _kittenService.GetLatestKittens(10);
          // Return something.
      }
   }  
}

namespace MyProject.Domain.Kittens
{
   public class Kitten
   {
      public string Name {get; set; }
      public string Url {get; set; }
   }
}

namespace MyProject.Services.KittenService
{
   public interface IKittenService
   {
       IEnumerable<Kitten> GetLatestKittens(int fluffinessIndex=10);
   }
}

namespace MyProject.Services.KittenService
{
   public class KittenService : IKittenService
   {
      public IEnumerable<Kitten> GetLatestKittens(int fluffinessIndex=10)
      {
         using(var db = new KittenEntities())
         {
            return db.Kittens // this explicit query is here
                      .Where(kitten=>kitten.fluffiness > 10) 
                      .Select(kitten=>new {
                            Name=kitten.name,
                            Url=kitten.imageUrl
                      }).Take(10); 
         }
      }
   }
}

【讨论】:

  • 您的意思是Where(kitten=&gt;kitten.fluffiness &gt;= fluffinessIndex)? :)
  • @TiesonT。接得好。我刚刚从original question 复制代码进行演示。 ;)
【解决方案3】:

ASP.NET MVC 和 MVC,一般来说,是一种表示层模式;因此,您与数据库的交互应该在表示层之外的层中,通常是数据访问层,但也可以是服务层或业务层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多