.NET:抽象数据源和数据上下文

.NET:抽象数据源和数据上下文,.net,database,entity-framework,domain-driven-design,entitydatasource,.net,Database,Entity Framework,Domain Driven Design,Entitydatasource,我正在尝试为我最常见的开发场景编写可重用组件: 我制作了一个通用表示层来表示要封装在域对象中的域对象和数据对象(dc serializable)。我还拥有某种域状态/上下文,在其中我将引用我的所有域对象实例。其思想是域对象具有特殊的集合,这些集合在第一次按需访问时从数据源填充。我想这不完全是“DDD”,但它似乎有效 无论如何,现在我被困在datacontext和datasource部分。我一直在思考如何存储数据并与数据源交互;zip文件中的xml、sql server、sql lite文件、实体

我正在尝试为我最常见的开发场景编写可重用组件:

我制作了一个通用表示层来表示要封装在域对象中的域对象和数据对象(dc serializable)。我还拥有某种域状态/上下文,在其中我将引用我的所有域对象实例。其思想是域对象具有特殊的集合,这些集合在第一次按需访问时从数据源填充。我想这不完全是“DDD”,但它似乎有效

无论如何,现在我被困在datacontext和datasource部分。我一直在思考如何存储数据并与数据源交互;zip文件中的xml、sql server、sql lite文件、实体框架、nhibernate、linqtosql、mongodb等,我无法决定使用什么。似乎我需要抽象掉数据源和数据上下文,而不是决定在每个应用程序中使用什么。重要的是,我不会在特定框架上嵌入任何硬依赖项

将datacontext和datasource抽象出来,并使其在各种现有框架中都能轻松工作,这是否现实?我想错了吗?这是一条死胡同吗

我所希望和需要的(我认为)是我的domainstate能够查询datacontext以查找与某些标准匹配的对象。我不确定它是否能够处理整个对象图,或者只处理单个数据对象,或者甚至不能处理具体类型,而只能处理一些通用对象,或者是否应该为每个请求克隆它们。当我开始思考这个问题时,我感到非常困惑

更新:

我将DataContext/DatabaseContext(例如EntityFramework)视为一个模块/层,用于将对象缓存在内存中,执行查询,从任何数据源获取和存储数据,并将类型化对象返回给使用者。是这样吗

存储库模式(DDD)和我的DataContext有什么区别

更新2:

基本上,这就是我的模型(好还是坏?):

DataSource->DataContext/DataObject->DomainState/DomainObject->Presenter

似乎我需要抽象掉数据源和数据上下文,而不是决定在每个应用程序中使用什么。重要的是,我不会在特定框架上嵌入任何硬依赖项

这就是存储库模式

存储库模式(DDD)和我的DataContext有什么区别

存储库是一种抽象与存储访问相关的所有内容的方法。它旨在满足应用程序的需求,并接收/发回应用程序其余部分已知的对象。DataContext是EF的一个实现细节,它本身就是存储库的一个实现细节

存储库具有双重用途

  • 允许您通过仅公开一个接口来更改存储数据的方式(更改数据库、使用xml文件等)

  • 它将您从以数据库为中心的方法中解放出来,让您专注于领域。这一点非常重要,因为每次您首先开始使用db模式设计应用程序时,您不可避免地会尝试将应用程序的其余部分放入其中,并且您将有一个模仿数据库模式的贫血域

  • DataSource->DataContext/DataObject->DomainState/DomainObject->Presenter

    在任何应用程序中,基本上都有查询(读取)和更新(写入)。在99%的情况下,域仅适用于写操作,因为读操作没有业务规则(没有行为),您只需选择要显示的相关数据

    因此,对于写作,我建议采用这种流程

    ViewModel(输入)->域处理(实体、服务等)->域存储库

    根据应用程序的不同,您可以通过多种方式从视图模型获取域实体。如果域非常简单,您几乎不需要域,视图模型将是域,在许多情况下与db模式相同

    阅读

    查询存储库->视图模型(演示者)

    当然,控制器通常调用查询存储库,它可能会根据从repo接收的数据组装所需的视图模型(在简单的情况下,repo会精确地返回视图模型)

    似乎我需要抽象掉数据源和数据上下文,而不是决定在每个应用程序中使用什么。重要的是,我不会在特定框架上嵌入任何硬依赖项

    这就是存储库模式

    存储库模式(DDD)和我的DataContext有什么区别

    存储库是一种抽象与存储访问相关的所有内容的方法。它旨在满足应用程序的需求,并接收/发回应用程序其余部分已知的对象。DataContext是EF的一个实现细节,它本身就是存储库的一个实现细节

    存储库具有双重用途

  • 允许您通过仅公开一个接口来更改存储数据的方式(更改数据库、使用xml文件等)

  • 它将您从以数据库为中心的方法中解放出来,让您专注于领域。这一点非常重要,因为每次您首先开始使用db模式设计应用程序时,您不可避免地会尝试将应用程序的其余部分放入其中,并且您将有一个模仿数据库模式的贫血域

  • DataSource->DataContext/DataObject->DomainState/DomainObject->Presenter

    在任何应用程序中,基本上都有查询(读取)和更新(写入)。在99%的情况下,域仅适用于写操作,因为读操作没有业务规则(没有行为),您只需选择要显示的相关数据

    因此,对于写作,我建议采用这种流程

    ViewModel(输入)->域处理(实体、服务等)->域存储库

    根据应用程序的不同,您可以通过多种方式从视图模型获取域实体。如果Doma