实体框架4.1和业务逻辑层

时间:2013-10-18 17:53:59

标签: asp.net entity-framework design-patterns

我正在尝试将Entity Framework 4.0用于asp .net应用程序。截至目前,它将是文件背后的旧式代码,没有单元测试,但在未来我可能会使用MVP和单元测试,但截至目前,它不是我的担忧。我正在使用Database First方法。这是一个模型(我无法发布图像,因为我需要声望来发布图像)

  • 表:应用程序(ApplicationID,名称,隐藏)
  • 表:用户(UserID,ApplicationID,用户名,IsActive)
  • 表:角色(RoleID,ApplicationID,名称)
  • 表:UserRole(UserRoleID,RoleID,UserID)

我一直在阅读很多关于Entity Framework的内容以及如何使用它,但仍然无法对某些内容有一个非常基本的想法。我在哪里为Application,User,Role,UserRole等编写这样的代码?

public List<Application> GetAllUnhiddenApplications()
{
    List<Application> applist = null;
    using (CustomAppsPortalEntities ctx = new CustomAppsPortalEntities())
    {
        applist = (from app in ctx.Applications
            where app.Hidden == false
            orderby app.Name
            select app).ToList();
    }
    return applist;
}

我分别在单独的项目Project.Data和Project.Entities中分离了Context和Entities。我的问题是,如果上面的代码属于BLL(类名ApplicationBLL)或DLL(ApplicationDLL)?从过去2天开始,我一直在搜索很多问题,博客,教程和不同的人有不同的方法。这是我的困境。

如果我将代码放在数据层中,那么在业务层中,我必须创建一个“传递”函数,如ApplicationBLL.GetAllUnhiddenApplications,它将返回ApplidationDLL.GetAllUnhiddenApplications。我必须为所有查询重复它,基本上整个BLL最终将成为DLL的“传递”层。您能否举一个具体的例子来说明在参考上述模式时将使用哪个Business层?

如果我将代码放在Business层中,那么linq将存在于Business层中,最终将由Entity Framework转换为SQL,因此就像将查询逻辑暴露给Business Layer一样。

我们的环境 我们的环境节奏很快,并希望尽快使用适度的方​​法完成这个项目,其中有一个单独的层,但是在将来我们找时间时,我们可能会重构代码并使其非常强大但它不是现在关注但是如果时间允许,我们现在要实施最佳实践,而不是在将来重构代码。

2 个答案:

答案 0 :(得分:0)

上述代码通常位于BL层。在BL层中使用linq很好,因为你的linq查询仍然是数据持久性无知。从linq查询的角度来看,它从实体框架中查询对象。

您可能缺少的是&#34;存储库模式&#34;和&#34;工作模式&#34;。存储库模式充当实体框架的接口。它允许您与内存集合之类的EF对象进行交互。通常,我将所有存储库保存在一个项目中并相应地引用。举个例子,Microsoft Spain提供了一个n层示例

http://microsoftnlayerapp.codeplex.com/

它设计得非常好,但我相信它能满足您的需求。

答案 1 :(得分:0)

许多人认为EF是DLL。

通常情况下,我将项目设置为类似的内容......

  D --->  Presentation Layers (MVC, WCF, WinForms, etc)
  A               |     
  T               V
  A --->  Business Logic Layer
                  |
  M               V
  O --->  Entity Layer / DLL
  D
  E
  L

Data Models项目实际上只是POCO的一个集合,可用于任何其他项目。

实体层是您的EDMX文件和上下文。

访问Entity / DLL层中的上下文应该没问题,因为.Net已经为你抽象了所有内容。

如果您考虑一下,抽象出DLL层的全部原因是您可以在不更改BLL的情况下更改数据库。使用EF,您可以一步更改数据库,只要您的架构保持不变,一切都应该仍然有用。