Asp.net 在webforms中使用实体框架的正确抽象是什么

Asp.net 在webforms中使用实体框架的正确抽象是什么,asp.net,architecture,entity-framework-4.1,Asp.net,Architecture,Entity Framework 4.1,我正试图找到一种设计解决方案的好方法。我知道我将使用以下技术:Asp.NETWebForms和EntityFramework4.1。我的EF模型基于现有数据库。我计划使用EF DbContext生成器来构建我的上下文和实体。这就是事情对我来说有点棘手的地方 我希望适当地分离关注点,提供更好的可测试性,并允许我将业务逻辑与DAL分离。目前我的解决方案中有三个项目:Web、Core和Data。我希望依赖关系是Web->Core您可以使用很多不同的模式,但我马上想到两种模式: 1) 添加业务/服务层-

我正试图找到一种设计解决方案的好方法。我知道我将使用以下技术:Asp.NETWebForms和EntityFramework4.1。我的EF模型基于现有数据库。我计划使用EF DbContext生成器来构建我的上下文和实体。这就是事情对我来说有点棘手的地方


我希望适当地分离关注点,提供更好的可测试性,并允许我将业务逻辑与DAL分离。目前我的解决方案中有三个项目:Web、Core和Data。我希望依赖关系是Web->Core您可以使用很多不同的模式,但我马上想到两种模式:

1) 添加业务/服务层-这将在数据层和表示层之间进行抽象。这是我最常采用的方法——使用AutoMapper和依赖项注入(我喜欢Ninject)使猴子工作起来更容易。您的业务层将公开自己版本的数据库对象(不推荐),或者公开与您的业务模型相关的对象(更健壮的方法)

2) 使用控制反转模式——目前非常流行,尽管我还没有在现实场景中尝试过。显然非常适合TDD/模拟等。。。这基本上意味着您的数据层依赖于您的业务层,而不是相反


仅供参考-我的“核心”或“通用”程序集对我的业务或数据层一无所知-它们只提供与平台无关的帮助程序和通用类-例如,如果我想创建通用MVC功能,我将创建一个Company.MVC.Core程序集。

如果您的解决方案完全是全新的,那么我喜欢在实体框架中使用代码优先的方法(请原谅这个无耻的插件,但我已经在我的博客上发布了一个关于这个的教程)。我喜欢它给我的控件,当我生成一个.edmx时,我似乎无法得到它

在结构方面,我通常将项目的各个层分离为单独的程序集:域(和数据)和由以下文件夹(命名空间)构成的WebUI:

我从不DI我的实体,而是在我的表示层中使用具体的实体,然而,我将始终使用ADO.Net(特别是对于遗留应用程序)进行DI,因为我的域层仍将使用ADO.Net读取/写入我的POCO实体。这样,当我最终有机会用我的遗留应用程序实现ORM时,我可以简单地对我域的ORM版本进行DI


作为对此的一个脚注,如果您遵循存储库模式,那么您总是可以将其与存储库进行接口并对存储库进行DI。无论哪种方式,您的POCO都应该是特定于解决方案的,这样基础数据结构不会经常发生显著变化,因此我从未对它们进行过DI。

为什么您不能让context和context.tt生成器留在您的数据项目中?我不认为有必要把它移到核心。当然,Core必须引用数据库中的上下文。这就是你所面临的问题,也是你不想要的吗?如果是这样的话,您将为您的应用程序增加一个全新的复杂性和抽象级别,因为您必须将EF从您的核心抽象出来(抽象的“存储库”和“工作单元”模式是通常的方法=要搜索的关键字)。不过,如果Core引用数据,事情就容易多了。我认为Core根本不应该依赖于数据,而是提供数据和Web都可以使用的基本POCO对象。这将使Web与数据完全分离,并允许更容易地交换数据的潜力(即:如果我们想转移到nHibernate或其他ORM)。
Domain (business layer and data layer assembly)
    Data (contains my EF data context and Interface to the context)
    Entities (contains my POCO objects for the context)

WebUI (presentation layer assembly)
    Infrastructure (contains my dependency inject initialiser)