C# DAL、模型层、EF代码优先和业务逻辑,它们是如何结合在一起的?

C# DAL、模型层、EF代码优先和业务逻辑,它们是如何结合在一起的?,c#,entity-framework,asp.net-mvc-4,data-access-layer,C#,Entity Framework,Asp.net Mvc 4,Data Access Layer,一点一点地,我不了解ASP.NET MVC4,并且越来越精通它。然而,对于这一非常重要的一点,我的头脑仍然不清楚。假设我有一个模型: public class WorkPaper { public int WorkPaperID { get; set; } public string name { get; set; } public string description {get ; set; } public bool verified {get; set;}

一点一点地,我不了解ASP.NET MVC4,并且越来越精通它。然而,对于这一非常重要的一点,我的头脑仍然不清楚。假设我有一个模型:

public class WorkPaper
{
    public int WorkPaperID { get; set; }
    public string name { get; set; }
    public string description {get ; set; }
    public bool verified {get; set;}
    public DateTime dateAdded {get; set;}

}
我将此模型与实体框架代码优先的方法结合使用,我有以下DB上下文:

public class NicodemeContext : DbContext
{
     public DbSet<WorkPaper> Workpapers { get; set; }
}
public类上下文:DbContext
{
公共数据库集工作文件{get;set;}
}
我不明白的是:什么是模型层,什么是数据访问层。对我来说,WorkPaper类往往是DAL的一部分,因为我设计了它,并选择了我的属性名称和类型(导航属性等),以适应EF模式。但问题是,如果我是对的,我真的不知道应该把业务逻辑放在哪里

在这种特定情况下,如果我想添加一条规则,说明未经验证的工作文件无法发送,以及另一条规则,说明如果工作文件在两周前添加,则无法提交(奇怪的规则,但这只是一个示例)。我应该在哪里添加它们?我必须创建另一个类吗?但是我应该把它放在哪里?它应该包含什么?对我已经上过的课来说,这不是很多余吗?但另一方面,由于该类是“面向数据库的”,在其中添加业务规则不是很麻烦吗

我的重点是理解我必须将业务逻辑放在哪里,理解DAL和模型之间的区别。我很难识别DAL和模型层,因为它们看起来与我非常相似。我想用正确的方式做事


(基本上,我不知道在哪里用MVC编写“我的程序”!当我想要编写我真正感兴趣的功能时,我感到不舒服。我觉得我做得不对)

你可以将NicodemeContext类放在DAL中,将WorkPaper类放在模型层中

  • 模型层是定义业务领域的地方。这就是您的业务逻辑所在
  • 数据访问层是从模型层读取和写入数据库并填充对象的层
一种有用的技术是在模型中使用分部类。在一个分部类中保留代码生成器可能编写的所有内容,在另一个分部类中保留手写的所有内容。例如,如果使用工具生成部分工作图纸类,它通常包含所有属性和关联。在手写部分类中,您可以放置业务逻辑。如果您的域发生了一些变化,这允许您反复运行类生成器,而不必担心丢失业务逻辑。我知道您说过要先使用代码,但仍然可以使用分部类

模型是放置业务逻辑并与保存和检索数据的数据访问层通信的地方。您的视图用于显示用户界面。控制器用于在视图和模型之间传递信息。要了解MVC需要一段时间,但你提出的问题是正确的,并且走在了正确的轨道上

希望这有帮助。干杯。

没有一种“正确”的方法可以做到这一点。可能有很多“错误”的方式,但与大多数事情一样,大部分都是“视情况而定”

你会在这方面找到很多意见。这在很大程度上取决于你如何接近它。例如,@Tarzan建议对业务逻辑和数据层实体使用您的模型。其他人建议创建单独的实体对象、业务对象和视图模型对象

如果您正在制作一个相对简单的CRUD类型的应用程序,那么您可能可以按照@Tarzan的建议去做,并且没有什么问题。然而,在更复杂的应用程序中,这样做会遇到问题。例如,当您的业务逻辑与数据逻辑不同时会发生什么情况?如果您将它们组合成一组实体,那么您将被迫使逻辑在任何地方都相同,或者花费大量时间进行改装

最灵活的方法是将表示层、业务层和数据层完全分开。这样,UI的需求(例如)就不需要与其他层匹配。(这里有一个简单的例子,假设对于某些类型的对象,某个特定字段允许为null,但对于其他对象不允许为null。您的数据层只知道该字段可以为null,而您的业务层则知道某些对象不能为null)

然而,这种方法可能会有很多开销,并且在每一层中都需要看起来像是重复的代码。。。创建大量额外的工作,这对于小型或简单的应用程序来说往往是不值得的

要记住的一个关键点是MVC是一种表示模式。这意味着它只关心用户界面。“模型”通常被视为“视图模型”,即视图使用的模型。此模型是根据视图需求定制的。例如,通过使用不会放在数据模型上的数据属性

如果你认为MVC是严格表象的,那么MVC不在乎你使用什么样的数据访问,也不关心你使用的是哪种业务层。它可以是服务层、存储库或业务对象库(如CSLA)

MVC应用程序中的一种常见模式是使用某种类型的服务层,如果您只是在执行CRUD操作,则使用存储库。每个层之间通常都有某种映射系统,使用AutoMapper或自定义构建映射类等技术

这里的要点很简单。MVC本身并不关心业务和数据,所以不要为如何将这些内容融入MVC应用程序而烦恼。他们没有,或者至少他们没有,除了非常基本的接口。