从控制器调用服务是否违反了MVC?

时间:2015-04-30 16:27:16

标签: c# asp.net-mvc design-patterns model-view-controller n-tier-architecture

我在线看到很多代码参考,他们直接在Controller中使用服务。

public class PersonController : Controller
{
   public ActionResult Index(int personId)
   {
       Person personDataModel = null;
       using(var service = new Personservice())
       {
          personDataModel = service.GetPerson(personId);
       }

       var personVM = MapPersonDataModelToViewModel(personDataModel);

       return View("Index",personVM);
   }
}

根据MSDN 控制器 是处理用户互动的组件,使用 模型 ,并最终选择 视图 来呈现显示UI。

提及服务的位置在哪里? 我知道有人在谈论服务层模式或SOA架构。但这仍然是 违规行为 。为方便起见, 违规

出于某种原因,如果我想取消服务。然后,我将最终更换控制器。并且必须建立我的模型。 相反,我想只更改模型。

我觉得Model应该有智能来通过调用外部服务或单独为Controller提供请求。

public class PersonController : Controller
{
   public ActionResult Index(int personId)
   {
       var personVM = PersonModel.GetPerson(personId);

       return View("Index",personVM);
   }
}

public class PersonModel
{
   public PersonVM GetPerson(int personId)
   {
      Person personDataModel = null;
       //Can either do this
       using(var service = new Personservice())
       {
          personDataModel = service.GetPerson(personId);
       }

       //Or can do this
       personDataModel = GetPersonDataModel(personId);

      var personVM = MapPersonDataModelToViewModel(personDataModel);

      return personVM;
   }
}

我知道PersonModel需要重新分解,但这不是重点。

更新:

当我的意思是模型时,我并不是指我们传递给View的MODEL(具有属性的类)。我的意思是模型文件夹中的类。

根据MSDN,模型:模型对象是应用程序的一部分,它实现了应用程序数据域的逻辑。通常,模型对象检索并存储数据库中的模型状态。

我从上面假设文件夹Model中的类对象应具有进行CRUD操作的逻辑。

我错过了什么。请分享您宝贵的想法。

1 个答案:

答案 0 :(得分:2)

没有。事实上,advocated是保持控制器美观和纤薄的一种方式。