DAL,模型层,EF代码优先和业务逻辑,它们如何组合在一起?

时间:2014-02-22 22:02:39

标签: 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;}
    public DateTime dateAdded {get; set;}

}

我使用此模型与实体框架代码第一种方法,我有以下数据库上下文:

public class NicodemeContext : DbContext
{
     public DbSet<WorkPaper> Workpapers { get; set; }
}

我不明白的是:什么是模型层以及什么是数据访问层。对我来说,WorkPaper类往往是DAL的一部分,因为我设计它并选择我的属性名称和类型(导航属性等...)以适应EF模式。但问题是,如果我是对的,我真的不知道应该把业务逻辑放在哪里。

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

我的观点是了解我必须放置业务逻辑并了解DAL和模型之间的区别。我很难识别DAL和模型层,因为它们与我非常相似。我想以正确的方式做事。

(基本上,我不知道在哪里用MVC编写“我的程序”!一旦我想编写我真正感兴趣的功能,我就不舒服了。我觉得我不是在做事情正确)

2 个答案:

答案 0 :(得分:7)

没有一种“正确”的方法可以做到这一点。可能存在一些“错误”的方式,但与大多数情况一样,“它取决于”。

你会发现很多意见。其中很大一部分取决于你如何接近它。例如,@ Tarzan建议将您的模型用于业务逻辑和数据层实体。其他人建议创建单独的Entity对象,业务对象和视图模型对象。

如果您正在制作一个相对简单的CRUD类型的应用程序,那么您可以像@Tarzan所建议的那样做并且几乎没有问题。但是,在更复杂的应用程序中,您开始遇到这样做的问题。例如,当您的业务逻辑与数据逻辑不同时会发生什么?如果将它们组合成一组实体,那么你不得不在任何地方使逻辑相同,或者花费大量时间进行改造。

最灵活的方法是将您的演示文稿,业务和数据层完全分开。这样,(例如)UI的要求不需要与其他层匹配。 (这是一个简单的例子,想象一下,对于某些类型的对象,允许特定字段为空,但不允许其他字段。您的数据层只知道该字段可以为空,而您的业务层将知道某些对象可以不行。)

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

要记住的一件重要事情是MVC是一种Presentation模式。这意味着它只关注用户界面。 “模型”通常被认为是“视图模型”,它是视图使用的模型。此模型是根据视图要求定制的。例如,通过使用您不会放在数据模型上的数据属性。

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

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

这里的要点就是这个。 MVC并不关心业务和数据,因此不要让自己全都了解这些如何适应MVC应用程序。他们没有,或者至少他们没有非常基本的接口。

您的应用程序是一组对象,可以视为一种体系结构。该体系结构由不同的层组成。 MVC,服务,数据等.MVC可能是主要的用户界面,但这并不意味着其他一切也都是MVC。

答案 1 :(得分:2)

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

  • 您可以在模型层中定义业务域。这就是您的业务逻辑。
  • 您可以在数据访问层中读取和写入数据库,并从模型层填充对象。

一种有用的技术是在模型中使用部分类。在一个部分类中,保留可能由代码生成器写入的所有内容以及在其他分部类中手写的所有内容。例如,如果使用工具生成部分WorkPaper类,则它通常包含所有属性和关联。在手写的部分类中,您可以放置​​业务逻辑。如果您的域发生了某些变化,这可以让您一次又一次地运行类生成器,而不必担心丢失业务逻辑。我知道你说你使用的是代码优先但是,部分类可能很有用。

模型是您放置业务逻辑的地方,并与数据访问层进行通信,从而节省了&amp;检索数据。您的视图用于显示用户界面。控制器用于在视图和模型之间传递信息。获得MVC的感觉需要一段时间,但是你正在提出正确的问题,并且正在走上正轨。

希望这会有所帮助。欢呼声。