4

这是关于使用 EF DB First 模型的分层设计。

到目前为止,我之前没有使用过实体框架,只使用了实体并放置在具有域/DTO 子文件夹的不同项目中。在 DataAccessLayer、业务层和 MVC 应用程序中也引用了相同的内容,并使用通常的 ADO.Net 查询编写了代码,并为我的实体准备了 POCO。没有问题。

现在我们正在使用 Entity Framework DB First 模型开发应用程序。我们选择了这个 DB First 模型,因为 DB 设计不在我们的控制范围内。它由 DBA 完成。

我想在这里重用旧的简单设计。但不确定我应该在哪里/哪一层完全适合 edmx 文件和生成的 POCO 类。我没有找到任何具有分层架构风格的样本使用 DBFirst 方法。

我提到了这个。http://aspnetdesignpatterns.codeplex.com但他们使用 Nhybernate

这是旧设计的高级概述。在此处输入图像描述

欢迎您对设计/样品提出任何建议。

编辑:

从下面的答案中,我认为实体框架会生成 POCO,我们可以将现有的实体/域层重命名为域层并将生成的 POCO 类放在那里。我们也可以简单地将 .edmx 保存在 DataAccessLayer 中,其中包含为 TDD 包装 EF 的 IRepository 类列表。这有意义吗?或任何有价值的点?

更新:

目前,我删除了 DataAccessLayer,只保留了实体层,它有一个 model.edmx 文件和由 EF 生成的类,以及所有实现 IRepository 的 Repository 类。我也将其称为业务层、MVC。我做得对吗?我觉得我的设计很糟糕:(请建议/帮助

4

4 回答 4

1

因为不幸的是,首先创建数据库的决定严重阻碍了您,所以您需要根据Eric Evans 的域驱动设计使用反腐败层

这是一个很好的解决方案,当你得到一个你绝对必须编码的糟糕接口时该怎么做 - 制作一个围绕数据库的接口,它的行为方式符合你想要的方式。不要将任何 EF 类直接暴露给除反腐败层本身之外的任何东西。

这是一个阅读示例:

public class SomeReadService : ISomeReadService {
  public SomeViewModel Load(Guid id) {
    using (var dbContext = new DbContext()) {
      // Query the DB model, then *map* the EF classes to SomeVieWModel.
      // This way you are not exposing the shitty DB model to the outside world.
    }
  }
}

这是一个写作示例:

public class SomeRepository : ISomeRepository {
  public SomeDomainObject Load(Guid id) {
    using (var dbContext = new DbContext()) {
      // Map the EF classes to your domain object.  Same idea as before.
    }
  }
}

我仍然会尝试向客户证明,拥有一个单独的团队设计数据库将是一场灾难(我的经验强烈表明它会)。看看是否有某种方式可以提供反馈,向客户证明如果你设计了数据库会更好。

于 2012-12-28T01:38:43.200 回答
1

请参阅以下类似问题的 SO 链接:

使用数据库优先的方法,我如何分离核心层和基础设施层?

希望这可以帮助 !!

于 2013-12-12T12:10:23.977 回答
0

编辑:

简短的答案是数据访问层 (DAL)

您需要企业架构,它会根据您的需求而变化,但在您的情况下,模型驱动设计模式是可靠的解决方案。您可以使用MVC ,并且可以从Poco或其他实体(如NHibernet等)驱动您的模型。

code-firstdb-first没有任何重要性,只是在架构创建阶段很有趣。

于 2012-12-25T20:56:22.343 回答
0

在我看来,正确使用实体框架不需要单独的 DAL。我认为 EF 是我的 DAL。它使您可以更专注于业务部分。EF 为您完成所有数据访问代码。您可以简单地在业务层中使用您的 EF 上下文。对我来说,这是 EF 的最大好处之一;这是你的 DAL。

根据您分离图层的方式(不同的程序集或程序集中的不同文件夹)取决于您放置 POCO 类的位置。如果不同的程序集(这对于大多数项目来说是多余的),那么所有其他人引用的“通用”程序集就是放置 POCO 类的地方。如果文件夹不同,则名为“Models”或“DomainModels”的文件夹就是该位置。

特别是对于 MVC 应用程序,我会将我的 POCO 类放在“Models”文件夹中(我也有一个“ViewModels”文件夹),并将我的 .Edmx 放在我有时称为“Logic”的 BLL 文件夹中。

如果您需要一个松散耦合的架构来进行测试,那么一个名为 Repositories 的文件夹以及包含在您自己的存储库模式中的 EF 上下文是您的最佳选择。

于 2012-12-12T08:59:53.133 回答