Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# MVC4+EntityFramework体系结构_C#_Asp.net Mvc_Asp.net Mvc 4_Architecture_Entity Framework 5 - Fatal编程技术网

C# MVC4+EntityFramework体系结构

C# MVC4+EntityFramework体系结构,c#,asp.net-mvc,asp.net-mvc-4,architecture,entity-framework-5,C#,Asp.net Mvc,Asp.net Mvc 4,Architecture,Entity Framework 5,按照这里提出的设计,我尝试使用MVC4+EntitifFramework5为DAL、BL和web创建不同的层 引用@davidepiras 1-项目名称.接口类库,实体接口 2-ProjectName.DAL类库,唯一一个允许知道使用了EF的类库,POCO实体使用另一个文件实现Project1的接口,在该文件中,您使用分部类重新声明相同的对象 3-ProjectName.BL类库,业务逻辑,引用了上述1和2两个项目 4-ProjectName.Web ASP.NET MVC应用程序,表示层,引用

按照这里提出的设计,我尝试使用MVC4+EntitifFramework5为DAL、BL和web创建不同的层

引用@davidepiras

1-项目名称.接口类库,实体接口

2-ProjectName.DAL类库,唯一一个允许知道使用了EF的类库,POCO实体使用另一个文件实现Project1的接口,在该文件中,您使用分部类重新声明相同的对象

3-ProjectName.BL类库,业务逻辑,引用了上述1和2两个项目

4-ProjectName.Web ASP.NET MVC应用程序,表示层,引用两个项目1和3,但不是2

我怀疑BL和DAL之间的联系。DAL知道EF,BL不应该。。但如何实施呢?我的意思是,我创建了两个层上代表我的实体的类,这对我来说似乎有点重复。。即使在BL中,我也会添加验证和其他SUTF,但是如何向BL公开数据库值呢

在默认的MVC4解决方案中

 DbSet<Entity> entity
我可以查询、查找等。。我想我需要把它们映射到我的数据库里?我可数?什么


完全困惑。。任何帮助都可以理解

不,业务逻辑层需要了解DAL,因为它需要调用DAL上的方法,以便仅使用接口检索/更新/添加数据,因此不应允许它查看POCO类。BL对EF一无所知,因为它应该是这样的,以防你想用其他东西取代EF

因此,例如,要添加新记录:

用户添加新的详细信息并提交表单 Web project使用作为接口的对象列表调用BL层中的附加项

BL项目有一些业务逻辑,在将对象列表传递给DAL之前的额外验证也可能有错误处理

DAL在数据库中创建项,然后,如果需要,返回接口列表
不,业务逻辑层需要了解DAL,因为它需要调用DAL上的方法,以便仅使用接口检索/更新/添加数据,不应允许它查看POCO类。BL对EF一无所知,因为它应该是这样的,以防你想用其他东西取代EF

因此,例如,要添加新记录:

用户添加新的详细信息并提交表单 Web project使用作为接口的对象列表调用BL层中的附加项

BL项目有一些业务逻辑,在将对象列表传递给DAL之前的额外验证也可能有错误处理

DAL在数据库中创建项,然后,如果需要,返回接口列表
当你提到DAL和EF时,线条会变得有点模糊。在某些情况下,你可以。但我通常不直接使用BL访问EF并将其抽象到更高的级别,以便您可以根据需要轻松地交换EF。我使用这个函数来进一步抽象EF。此模式的另一个优点是,它使单元测试更容易,并且可以使用依赖项注入。我还使用来处理系统中的事务。那么,存储库和工作单元是DAL的一部分还是只是EF。这可能是有争议的,我知道我自己不再关心试图定义DAL。下面是我建议在MVC4项目中使用的层


应用程序或域层是您的BL层。我倾向于将中使用的概念合并到这个层中,因为我还没有看到将它分离出来的任何好处。但也可以选择在顶部添加此层

谈到DAL和EF时,线条可能会变得有点模糊。在某些情况下,你可以。但我通常不直接使用BL访问EF并将其抽象到更高的级别,以便您可以根据需要轻松地交换EF。我使用这个函数来进一步抽象EF。此模式的另一个优点是,它使单元测试更容易,并且可以使用依赖项注入。我还使用来处理系统中的事务。那么,存储库和工作单元是DAL的一部分还是只是EF。这可能是有争议的,我知道我自己不再关心试图定义DAL。下面是我建议在MVC4项目中使用的层


应用程序或域层是您的BL层。我倾向于将中使用的概念合并到这个层中,因为我还没有看到将它分离出来的任何好处。但也可以选择在顶部添加此层

谢谢。我是否正确地假设视图模型应该在BL中?而且,除了验证和特殊情况外,许多视图模型都是与DAL中相同的实体。。所以我需要创建两个使用相同接口的类,否则我错了?BL中的视图模型是的,基于实体的类应该实现实体所实现的相同接口,以允许
便于在类型/接口之间进行转换。你说得对:谢谢。我是否正确地假设视图模型应该在BL中?而且,除了验证和特殊情况外,许多视图模型都是与DAL中相同的实体。。所以我需要创建两个使用相同接口的类,否则我错了?BL中的视图模型是的,基于实体的类应该实现实体所实现的相同接口,以便在类型/接口之间更容易转换。你说得对:有很多东西要读。。这很酷:我确实需要提高我的建筑技能,现在我是一个新手非常非常新手!!例如,如果您正在执行非常低级的数据访问原始ADO.NET命令,那么这是一个很好的体系结构。然而,我认为实体框架是您的存储库和UOW。dbcontext是为填补这两个角色而设计的,所以我不会在上面添加额外的不必要的层。MattDavey-我完全不同意你的评论。如果您查看我在回答中提供的关于存储库和UOW设计模式的链接,您将看到使用EF时如何实现它们的详细描述。通过使用这些设计模式,您可以轻松地模拟EF层进行单元测试,或者将EF换成另一个ORM,而不会影响应用层。将这些层添加到EF中,而不是直接从应用程序或域层使用EF,肯定有好处。您不必使用它们,但这样做会使您的应用程序更加脆弱。能够交换ORMS是人们多年来一直使用的老理由,但实际上,这种情况发生的频率是多少?几乎从来没有。我同意单元测试的观点,但在这种情况下,让我们称之为测试接缝,而不是将其伪装为架构层。如果您正在实现EntityFramework设计用来解决的两个主要问题,那么使用EntityFramework还有什么意义?不妨使用Dapper之类的工具,它没有存储库或UOW的概念。请参阅本文,详细解释为什么在使用丰富的ORM(如EF或NHibernate)时,存储库往往不必要的复杂性。。这很酷:我确实需要提高我的建筑技能,现在我是一个新手非常非常新手!!例如,如果您正在执行非常低级的数据访问原始ADO.NET命令,那么这是一个很好的体系结构。然而,我认为实体框架是您的存储库和UOW。dbcontext是为填补这两个角色而设计的,所以我不会在上面添加额外的不必要的层。MattDavey-我完全不同意你的评论。如果您查看我在回答中提供的关于存储库和UOW设计模式的链接,您将看到使用EF时如何实现它们的详细描述。通过使用这些设计模式,您可以轻松地模拟EF层进行单元测试,或者将EF换成另一个ORM,而不会影响应用层。将这些层添加到EF中,而不是直接从应用程序或域层使用EF,肯定有好处。您不必使用它们,但这样做会使您的应用程序更加脆弱。能够交换ORMS是人们多年来一直使用的老理由,但实际上,这种情况发生的频率是多少?几乎从来没有。我同意单元测试的观点,但在这种情况下,让我们称之为测试接缝,而不是将其伪装为架构层。如果您正在实现EntityFramework设计用来解决的两个主要问题,那么使用EntityFramework还有什么意义?也可以使用Dapper之类的工具,它没有存储库或UOW的概念。请参阅本文,详细解释为什么在使用EF或NHibernate等丰富ORM时,存储库往往不必要的复杂性>