【问题标题】:Interaction between Action Methods and Repository classes inside asp.net mvcasp.net mvc 中的 Action 方法和 Repository 类之间的交互
【发布时间】:2014-12-25 11:43:03
【问题描述】:

我正在开发 asp.net mvc5 Web 应用程序,我正在使用实体框架作为数据访问层。每当我开始实现新的需求时,我总是纠结于如何设计动作方法和存储库类之间的交互。 .例如,假设我有以下 Post Create 操作方法:-

Public ActionResult CreateStudent (Student student)
{
repository.AddStudent(student);
repository.Save();
return RedirectToAction(“Index”);
}

这里是存储库

Public class Repository {
Public Void AddStudent (Student student)
{
// + Initiate a pending Audit Object
//+ Create new Person object and retrieve its ID
SaveChanges();
//+ create new Student and assign it to the created Person
// + Complete Audit object
}

这就是我目前实现交互的方式,从操作方法到存储库的调用更少,而且我有某种大型存储库方法。

但作为另一种方法,我可以对存储库方法进行更多调用,并且与第一种方法相比,存储库方法更小,例如:-

Public ActionResult CreateStudent (Student student)
{
var audit = repository.IntiateAudit(student);
var person = repository.AddPerson(student);
repository.Save();
var student2 = repository.AddStudent(person);
repository.CompleteAudit(audit);
repository.Save();
return RedirectToAction(“Index”);
}

这里是存储库

Public class Repository {
Public Audit IntiateAudit(Student student)
{
//implementation goes here…
Return Audit;
}
Public Person AddPerson (Student student)
{//implementation goes here…
Return Person
}
Public Student AddStudent (Person person)
{//implementation goes here…
Return student;
}

一般来说,哪种方法被认为更好;要么具有较小的存储库方法和多个调用,要么具有较大的存储库方法,对存储库方法的调用较少?

【问题讨论】:

  • 如果代码有效并且您所需要的只是编码提示或建议,那么应该在Programmers StackExchange提出这个问题
  • 无论哪种方式都有效,哪个“更好”是见仁见智的问题。
  • @BenRobinson 在一定程度上是的,但我可以说出于性能原因考虑更好的存储库方法调用吗?
  • @MatiCicero 是的,我不是指任何错误,但我在询问要遵循的设计方法......
  • @johnG 如果您的方法将数据保存到数据库中,则更多形式更少方法调用之间的相对性能差异将微乎其微。

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

我不会将这些单独的存储库调用放在控制器中,因为您通常不应该真正负责在那里创建学生的实现细节。

我会让控制器实现一个学生服务并在该服务上有一个CreateStudent 方法。该服务将实现它需要处理编排所需逻辑的存储库或上下文。

如果你有一个服务,你可以封装跨越存储库的逻辑,并隐藏不应该作为模型的控制器的细节。 服务很容易重复使用——例如也许稍后你会在你的应用程序中添加一个 API 层,它也可以创建学生。你不想复制代码来做到这一点。 访问器。 您还可以创建一个数据访问器层来隐藏存储库和 UoW。

【讨论】:

  • 但目前我不使用服务类,我有调用存储库的控制器,所以哪种方法更好.. 定义服务类或直接在控制器中使用代码之间有什么区别教程和文档做..
  • 是的,你应该使用服务层。第一个选项应该是服务方法,第二个选项应该是你如何实现你的存储库层(你可以使用通用存储库)。教程和文档不会向您展示任何设计模式,它们只专注于向您展示功能。他们使用死的简单代码来不打扰您不相关的主题。
【解决方案2】:

实际上,我构建了一个 MVC 4 门户,我将所有内容都放在了 MVC 应用程序中,例如控制器中的业务逻辑、模型中的数据访问以及视图中的表示层。

这种方法适用于没有太多业务逻辑和小型数据模型的小型项目,使用这种模式,您可以将所有调用放在控制器和区域部分中,您将需要帮助类一些业务逻辑,模型将只保存数据定义,视图将列出数据。

我更喜欢并在我的新系统中努力的一种新方法是将 MVC 应用程序作为表示层处理,控制器将在其中进行所需的准备和格式化以将数据(模型)发送到视图呈现出来。

在这种情况下,您需要一个新的 BLL(类库或服务)来保存您的所有业务,以及 DAL(类库或服务)来保存您的所有数据访问工作。

在这种情况下,MVC 应用程序将对 BLL 进行最少的调用以获取任何数据/逻辑处理,如果 BLL 需要从 DAL 获取一些数据,它将执行相同的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多