2017-06-12 53 views
2

我目前正在使用Active Directory和SQL Server 2008的Intranet网站上工作。我选择了ASP.NET的MVC设计模式,现在我正试图弄清楚如何为我的项目获得适当的体系结构,以实现数据访问部分使用实体框架。为了不去错误的方向(我知道我是我公司唯一的开发人员,这是我的第一次经历,没有人知道最近的框架),我一直在努力奋斗几天。我已阅读过有关架构及如何正确执行此操作,但我不确定是否正确掌握了所有内容(How do architect an ASP.Net MVC app with EF?)。我是否了解ASP.NET MVC和实体框架的架构设计?

这是我在想什么做的,有自己的项目中的每个层(原谅我的绘画技巧):

Controller(MVC Project) ---uses---> Service Layer (Project) ---uses--> EFDal (Project) 
      ^      |  ^      | 
       |       |  |       | 
       |<-------<-----returns ViewModel |<---------<------returns Query Result 

EFDal是的EntityFramework数据访问层。

从我的理解,服务层将包含方法,调用DAL反过来用于访问数据。

您是否在我的方法中看到错误?
我说得对服务层,是一个包含所有操作? (例如:搜索的数据库用户 - >服务层通过调用EFDal其返回值展开搜索,并反过来服务层返回一个视图模型控制器) (参见:Creating a Service Layer for my MVC application?

最后,如果我的服务图层类实现用于持久性目的的接口?

作为一名学生,我们只在项目中使用了MVC模式,并且从不需要通过新项目扩展解决方案,因为我们从事小型项目。在这里,我觉得对架构的误解会导致灾难性的可维护性。谢谢你的帮助!

+0

根据应用程序的大小,有很多可能的体系结构。对于较小的应用程序,您可能会使用引用EF的单个MVC项目。我们大多数都是中等大小的,我们为EF的东西创建App.Data(上下文,流利,迁移)App.Entities为我们的POCO模型,App.MVC为我们的UI,然后使用Automapper创建ViewModels。 [CQRS](https://msdn.microsoft.com/en-us/magazine/mt147237.aspx)是另一种选择。 –

+0

@SteveGreene谢谢你的回答。这就是我要做的。尽管没有使用过Automapper,但并不确定我需要它,我所有的数据表都非常简单,我只是有很多。至少从我所了解的Automapper用于复杂对象?我真的不能说应用程序有多大,但公司有4.5万名员工(和一名实习生在做这类事情......)以及许多通过Active Directory或SQL Server进行管理的不同操作,所以我需要很好的表现。 –

+1

性能和体系结构通常会进行折衷。 EF不是最高性能的数据访问技术。见[这里](https://stackoverflow.com/questions/8347670/entity-framework-is-too-slow-what-are-my-options)。这是SO与Dapper一起的原因之一。 –

回答

2

你几乎在正确的方向。但是,这种情况下的ViewModel应该位于应用层,即您的MVC层。服务层依次返回一个数据传输对象,通常称为DTO

ViewModel作为针对View构建了一个简单POCO类的思考,也可以是从服务层通过各种服务返回的各种DTO的集合。的DTO

  1. 优势可以不直接暴露你的域实体,即你的EntityFramework POCO类。但是,对于一个小到足以避免DTO在一起的项目,可能会出现这种情况。

  2. 如果将来您决定在您的MVC项目中添加WebAPI函数,例如对于iPhone应用程序。新应用程序使用WebAPI也消耗服务层,大多数服务层代码可以重新使用,因为它们返回DTO类而不是ViewModel,它是为View本身构建的。

对于您的数据访问层,没有人比这个人解释得更好。Entity FrameWork With Repository Pattern

至于项目结构,我会建议一个洋葱的架构。 Onion Architecture。如果你能够很好地理解这篇文章,那么你应该全都定下来。

+1

洋葱链接坏了 – Andrei

+0

@Andrei,修正了,谢谢你的通知。 – IvanJazz

+0

@IvanJazz好的谢谢!我会马上阅读这些文章(和Mosh的视频,总是点!)。那么ViewModel POCO会创建服务层类的实例吗?而在服务层内部,我有一个类和它的相应接口? –