2011-10-12 69 views
3

我必须使用Entity Framework 4.1和ASP.NET构建Web应用程序的体系结构。我已经有了数据库结构,所以我必须使用数据库的拳头。我在这里阅读了很多文章和主题,但似乎我错过了一些东西。我已决定以下列方式组织项目:使用Entity Framework 4和Repository Pattern的多层体系结构

我已经用Linq2Sql构建了一个Web应用程序。我用this project。它提供了一个T4模板,为每个实体生成一个特定的静态资源库类。我喜欢这种方法,因为它很容易向任何存储库添加额外的逻辑,例如GetUserByName()。我喜欢这种方法,但目前为止我还找不到EF4的类似方法。我发现只有通用的存储库,然后我必须手动创建具体的存储库。在这种情况下,我不喜欢的首先是我正在处理的应用程序有一些复杂的业务逻辑,所以我将不得不手动创建几乎每个实体的具体存储库。其次,如果起初我使用通用资源库来获取所有实体,并且以后需要使用例如GetUserByName(),那么代码中会出现不一致。我宁愿所有的数据都是以相同的方式完成。

我要么遗失了一些建筑结构。

  • 通用:通用信息库,如果这里有必要进行分隔

  • DAL:本EDMX(实体模型)与上下文类和库

  • BLL文件:的业务逻辑系统

    - 实体

    - 服务

    - 等

  • UI:ASP.NET页面

问题:

  1. 是逻辑的分离是否正确?

  2. 我应该使用特定的存储库吗?

  3. 什么样的存储库模式的实施,你会推荐最好的项目组织和易于使用?

  4. 使用静态存储库更好吗?

由于

+4

在windows和web开发的沉重金融系统中拥有背景我到目前为止只有很少的问题,为什么你认为你的实体应该住在BLL中至今我的经验是实体是非常基本的单元, 。 –

+0

那时我还没有做出最后的决定。我也想用EF生成它们并将它们放入DAL中。 – Thea

+2

@泰迪 - 这些实体应该(可以)进入一个共同的“层”/装配体,以​​便它们可以重新使用;这些与实体数据访问专用的EF实体不同。 –

回答

0

我的首选设置是:

  • Project.Presentation(UI)
  • Project.Application(应用层,该层暴露DTO的消费者/用户界面和执行这些命令域层)
  • 项目。域名
    • 实体[与逻辑域(订单,客户,...)
    • 域服务(TransferService,CreditCardService ...)
    • 库接口(IOrderRepository,ICustomerRepository,...)
  • Project.Repositories.EF(数据存取使用特定的技术实现存储库接口(OrderRepository,CustomerRepository)
  • Project.Infrastructure(交叉切割)
1

不要使用静态类作为存储库。对于正确的面向对象的设计来说这很可怕。它也完全阻止了任何控制和依赖注入反转的可能性。

如果您要使用存储库模式,则必须使用特定存储库。通用存储库只是EF相关类的包装(其中ObjectSet/DbSet已经是EF相关存储库)。您还应该在聚合根之上构建存储库,而不是在每个实体之上。

+0

感谢您的建议。你知道生成特定存储库的方法吗?手动操作既费时又麻烦。 – Thea

+0

特定存储库是手动作业... –