Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net mvc中操作方法和存储库类之间的交互_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Asp.net Mvc 5 - Fatal编程技术网

C# asp.net mvc中操作方法和存储库类之间的交互

C# asp.net mvc中操作方法和存储库类之间的交互,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,asp.net-mvc-5,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Asp.net Mvc 5,我正在开发asp.net mvc5 web应用程序,并使用实体框架作为数据访问层。每当我开始实现新的需求时,我总是被困在如何设计动作方法和存储库类之间的交互上。例如,假设我有以下创建后操作方法:- Public ActionResult CreateStudent (Student student) { repository.AddStudent(student); repository.Save(); return RedirectToAction(“Index”); } 这是存储库 Pub

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

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 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;
}
这就是我目前实现交互的方式,减少了从action方法到repository的调用,而且我有一些大型的repository方法

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

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 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 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;
}

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

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

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

如果您有一个服务,您可以封装跨存储库的逻辑,并对不应充当模型的控制器隐藏详细信息。 服务很容易重用-例如,也许以后你会在你的应用程序中添加一个API层,它也可以创建学生。您不想复制代码来实现这一点。 访问者。
您还可以创建一个数据访问器层,该层将隐藏存储库和UoW。

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

这种方法适用于没有太多业务逻辑和小型数据模型的小型项目,使用这种模式,您可以将所有调用放在controller和areas部分中,您可以使用helper类来执行一些业务逻辑,模型将只保存数据定义,视图将列出数据

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

在这种情况下,您需要一个新的BLL(类库或服务),它将容纳您的所有业务,而DAL(类库或服务)将容纳您的所有数据访问工作


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

如果代码有效,而您只需要一个编码提示或建议,那么无论哪种方式都应该问这个问题,哪种方式更好这是一个意见问题。@BenRobinson在某种程度上是的,但我能说,出于性能原因,存储库方法调用越少越好吗?@MatiCicero是的,我指的不是任何错误,但我想问的是要遵循的设计方法…@johnG如果您的方法将数据保存到数据库,多形式少方法调用之间的相对性能差异将很小。但目前我不使用服务类,我有控制器调用存储库,所以哪种方法更好。。和许多教程和文档一样,定义服务类和将代码直接放在控制器中有什么区别呢?是的,您应该使用服务层。第一个选项应该转到服务方法,第二个选项应该是如何实现存储库层(您可以使用通用存储库)。教程和文档不会向您展示任何设计模式,它们只专注于向您展示功能。他们使用死气沉沉的简单代码来避免无关主题的困扰。