使用EF,存储库,实体清洁解决方案(项目)结构

时间:2011-03-12 14:29:26

标签: asp.net-mvc entity-framework projects-and-solutions project-structure

我喜欢尽可能保持项目结构的清洁。 样品:

--BlogApp.sln
  --BlogApp.Data
      BlogModel.edmx (the EF mappings)
      Post.cs (I end up having partial classes in here with attributes)
  --BlogApp.Domain
    --Entities
        Post.cs (I would like to have my POCOs here with all its additional logic)
    --Repositories
        PostsRepository.cs
  --BlogApp.Ui
      (standard MVC structure)

当我使用EF作为我的ORM时,我最终弄得一团糟。任何人都可以建议一些“干净”的方式来构建项目吗?或许您可以建议一些最常用的标准项目结构。

2 个答案:

答案 0 :(得分:19)

我的首选结构是:

Solution
  -- Common
       - Shared features used accross all layers
       - You can also place interfaces for repositories and uow here
  -- Entities - shared among DataAccess, Business (and UI in small projects)
       - T4 template + partial classes + custom enums  
       - partial classes can contain methods with domain logic => domain objects 
  -- DataAccess - all EF dependent code here
       - EDMX or code first mapping
       - Repositories
       - UnitOfWork
  -- Business - not every project needs this assembly
       - Business services 
       - Logic like workflows
       - DTOs exposed to UI
  -- UI
       - Controllers
       - Views
       - ViewModels

答案 1 :(得分:2)

查看T4 Templates and the Entity Framework上的这篇文章。您可以为通过EF生成的实体属性编写自定义属性。我已经多次这样做了,在弄清楚如何做之后,它现在节省了很多时间。我之前尝试过使用部分类,但我的EF生成的类最终会使用自定义属性覆盖另一个类。也许我做错了什么,但无论如何,我现在更喜欢T4模板解决方案,因为它对我来说似乎更干净 - 最小化项目中的类数量。

此外,当您从DB更新EF模型并重新生成类时,您的自定义属性仍然存在。 FTW!

<强> ADDED : 顺便说一下,我们通常在数据层中定义我们的模型对象,让它们由EF的实体映射/填充。或者(甚至更简单)使用EF生成的实体一直到UI层,而无需自定义POCO。