2011-11-03 83 views
2

我想构建我的MVC web项目,我遇到了一些问题。构建ASP.Net MVC 3与EF

我正在使用EF4.1。我用EDMX文件创建了一个DataAccess项目。然后我使用dbContext生成器来创建我的POCO .tt类。

就在现在,我的业务逻辑层可以很好地访问POCO类,但表示层不能。

我认为我应该创建另一个抽象层,并将dbContext .tt文件放入他们自己的项目中,这样BusinessLogic层和Presentation层就可以访问POCO类,但只有BusinessLogic才能访问到实体框架。表示层不需要知道关于EF的任何信息。

事情是这样的......

POCO Classes - DataAccess 
    |    | 
    |---------Business Logic 
    |    | 
    |_________Presentation 

我在这里在正确的轨道上,如果是这样,我干脆砍了.TT文件/粘贴到新的项目或者是有办法迫使dbContext插件在我的其他项目中创建这些插件?

回答

2

您的表示层不必知道有关EF的任何信息。只需从您的表示层引用该项目即可访问模型。

但是 - 您的表示层不应该理想地使用任何POCO模型。他们应该使用ViewModels。由于DTO具有特定的目的,我不一定相信DTO。您的存储库/数据访问可以返回模型,但通常会返回到服务层。服务层然后将您的ViewModel表示返回到您的控制器。

这使你很好地依赖注入,因为进入你的控制器,你只需注入你的服务层。在您的服务中,您可以注入所需的任何存储库,等等。

讽刺的是,我认为我可以在本书中工作这个确切的主题很快:)

+0

所以我一直在研究ViewModels,我想我理解这个概念。我的下一个问题:创建ViewModel时,是否在我的模型中引用了POCO类?我所见过的大多数示例似乎都访问了某种类型的存储库,通常称为_accountRepository。但我不确定这些存储库在结构中的存储位置。 – Scottie

+0

我的存储库我将保留在一个数据存取项目中。该存储库将返回您的EF poco对象(或任何poco对象)。在一个单独的项目中,我会有我的逻辑即服务。有些人选择在他们的模型类上使用扩展方法,将其转换为视图模型。我在我的服务层中执行此操作,例如GetCustomerEditViewModel(int customerId),它获取我的实体并将其映射到poco。请参阅Jimmy Bogards文章:http://lostechies.com/jimmybogard/2009/06/30/ how-we-do-mvc-view-models /我喜欢automap属性实现,以便将其转换为虚拟机。 –

0

考虑在业务逻辑和表示层之间发送Data Transfer Objects。这将允许您为视图设置数据,并防止信息泄露到表示层(例如,如果您的业务逻辑需要POCO中有一个字段,但不需要在表示层中提供该字段)。

问题是,如何将数据移入或移出 表示层?换句话说,如果表示层 持有对域模型组件的引用? (在实体框架 方案中,域模型组件刚刚创建了 EDMX文件的DLL)。

单纯从设计的角度来看,DTO的是真正贴近 完美的解决方案。 DTO帮助将服务层和域模型的表示从进一步分离。当使用DTO时,表示层和服务层共享数据合约而不是类别 。

一层DTO将领域模型从演示中分离出来,导致松耦合和优化的数据传输。

如果你走这条路线,也可以查看Automapper来帮助你将DTO映射到POCO,反之亦然。

+0

我认为他的观点是,他想用POCO的DTO作为的。如果您不标记poco并使用流畅映射来满足需求,那么这很有可能。 –

0

所以有几种方法来构建您的项目。你所指的是一种方式,你可以在所有层之间共享poco。

另一种方法是让您的POCO进入数据和业务层,然后创建一个在UI和业务层之间共享的类似对象模型。最后,您也可以为UI创建第三个模型,只称为ViewModel。

这一切都取决于您的需求。如果您的对象模型非常复杂,那么您可能需要使用ViewModels来简化它。