如何在不依赖公共数据上下文实例的情况下保持相关实体之间的参照透明性?

马特·卡夏特(Matt Cashatt)

感谢您的光临。

背景

在我的.NET应用程序中,我通常具有一个包含我的业务方法的业务逻辑层(BLL)和一个包含我的Entitiy类以及用于处理原子实体的任何方法(即,单个实体的CRUD方法)的数据访问层(DAL)。这是一个非常典型的设计模式。

这是我的意思的伪代码示例:

BLL

public static int CreateProduct(ProductModel product){
    return DAL.SomeClass.CreateProduct(new DAL.Product{
       Name = product.Name,
       Price = product.Price
    });
}

public int CreateProduct(Product p){
    var db = new MyDataContext();        
    db.Products.AddObject(p);
    db.SaveChanges();
    return p.Id;
}

这个简单的例子没有问题。

理想情况下,实例化数据上下文并使用该数据上下文的所有事务都存在于DAL中。但是,如果我尝试处理稍微复杂一些的对象,这将成为一个问题:

BLL

public static int CreateProduct(ProductModel product){
    return DAL.SomeClass.CreateProduct(new DAL.Product{
       Name = product.Name,
       Price = product.Price,
       ProductType = DAL.SomeClass.GetProductTypeById(product.ProductTypeId) //<--PROBLEM
    });
}

现在,我没有保存实体,而是出现以下错误:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

好的,因此解决此问题的答案是将一个通用数据上下文传递给两个调用:

BLL

    public static int CreateProduct(ProductModel product){

using{var db = new DAL.MyDataContext()){

        return DAL.SomeClass.CreateProduct(new DAL.Product{
           Name = product.Name,
           Price = product.Price,
           ProductType = DAL.SomeClass.GetProductTypeById(product.ProductTypeId, db) //<--CONTEXT
        }, db); //<--CONTEXT
    }
}

问题

这解决了眼前的问题,但是现在我的参照透明性很差,因为我必须:

  1. 在BLL中实例化数据上下文
  2. 将数据上下文从BLL传递到DAL
  3. 在DAL中创建覆盖的方法,这些方法接受数据上下文作为参数。

对于某些人来说,这可能不是问题,但对我而言,因为我以更加实用的风格编写代码,所以这是一个大问题。毕竟它们都是同一个数据库,那么为什么不管这些实体的数据上下文实例为何,我都无法处理它们呢?

其他注意事项

我意识到有些人可能会想简单地说为所有调用创建一个公共数据上下文。这不会成功,因为出于多种原因这样做是不好的做法,最终会导致连接池溢出。有关更多详细信息,请参见此好答案

任何建设性的意见表示赞赏。

香农

我个人跟踪工作单元,并通过静态方法将数据上下文与其关联。如果您不是在谈论寿命长的操作,例如我当前的项目,一个ASP.NET应用程序,其中每个请求都是一个(主要是)不同的单元,并且请求的开始和结束与该单元的开始/结束是一致的,则此方法非常有用。我将数据上下文存储在请求CurrentContext中,如果您不熟悉它,则它基本上是由系统管理的字典,该字典分配可通过静态方法访问的特定于请求的存储。那里的工作已经为我完成,但是您可以找到许多实现自己的工作单元模式的示例。每个Web请求一个DbContext ...为什么?

对于许多人来说,另一个同样可行的答案是注射。用于此目的(注入数据上下文),它基本上模拟了您在问题末尾编写的代码,但使您免受不喜欢的“非功能性”内容的侵扰。

是的,您只访问一个数据库,但是如果仔细查看,您会发现数据库不是这里的约束。这是由高速缓存引起的,高速缓存旨在允许多个不同的并发数据副本。如果您不希望这样做,那么可以使用其他许多解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

域模型如何在不依赖UI和数据的情况下与UI和数据进行交互?

来自分类Dev

如何在不依赖数据库的情况下启动spring-boot应用程序?

来自分类Dev

如何在不依赖数据库的情况下启动spring-boot应用程序?

来自分类Dev

如何在不依赖数据库的情况下启动spring-boot应用程序?

来自分类Dev

如何在不依赖JAX-RS实现的情况下捕获404(NotFoundException)?

来自分类Dev

如何在不依赖通知的情况下获取键盘高度

来自分类Dev

如何在不依赖项目的情况下解析Maven Pom中的工件路径?

来自分类Dev

如何在不依赖项目的情况下解析Maven Pom中的工件路径?

来自分类Dev

我如何在不依赖闪亮的情况下引用闪亮的电抗值?

来自分类Dev

如何在不依赖fps的情况下提取“存储的帧”?

来自分类Dev

如何在不依赖模块的情况下共享Terraform脚本

来自分类Dev

如何在每种情况下(事件,助手,挂钩)访问数据上下文和模板实例?

来自分类Dev

如何在不依赖JavaScript中的ID,类或内容的情况下查找和检索节点位置

来自分类Dev

如何在不使用存储库的情况下共享EntityFramework 6数据上下文?

来自分类Dev

如何在不传递上下文的情况下读取添加到DbContext的实体

来自分类Dev

如何在没有保持上下文的功能的情况下重复 PHP 中的代码块?

来自分类Dev

如何在不违反依赖注入的情况下为单个数据库使用多个上下文

来自分类Dev

如何在没有GADT或数据类型上下文的情况下定义列表的Eq实例

来自分类Dev

如何使用DNN上的编辑器添加HTML / CSS?如何在不依赖模块的情况下添加标记?

来自分类Dev

如何在不访问上下文的情况下从线程更新我的Android SQLite数据库?

来自分类Dev

如何在不依赖页面中使用的结构/样式的情况下,在页面上的每个其他元素之上呈现元素?

来自分类Dev

如何在没有上下文的情况下访问“克隆站点对象”?

来自分类Dev

如何在不显式提供动作上下文的情况下更改深层嵌套的状态?

来自分类Dev

流星-如何在不丢失上下文的情况下重试失败的HTTP请求?

来自分类Dev

如何在没有任何请求,会话等的情况下获取上下文?

来自分类Dev

如何在没有上下文的情况下导航?

来自分类Dev

如何在没有上下文管理器的情况下连接到WebSocket?

来自分类Dev

流星-如何在不丢失上下文的情况下重试失败的HTTP请求?

来自分类Dev

如何在没有任何请求,会话等的情况下获取上下文?

Related 相关文章

  1. 1

    域模型如何在不依赖UI和数据的情况下与UI和数据进行交互?

  2. 2

    如何在不依赖数据库的情况下启动spring-boot应用程序?

  3. 3

    如何在不依赖数据库的情况下启动spring-boot应用程序?

  4. 4

    如何在不依赖数据库的情况下启动spring-boot应用程序?

  5. 5

    如何在不依赖JAX-RS实现的情况下捕获404(NotFoundException)?

  6. 6

    如何在不依赖通知的情况下获取键盘高度

  7. 7

    如何在不依赖项目的情况下解析Maven Pom中的工件路径?

  8. 8

    如何在不依赖项目的情况下解析Maven Pom中的工件路径?

  9. 9

    我如何在不依赖闪亮的情况下引用闪亮的电抗值?

  10. 10

    如何在不依赖fps的情况下提取“存储的帧”?

  11. 11

    如何在不依赖模块的情况下共享Terraform脚本

  12. 12

    如何在每种情况下(事件,助手,挂钩)访问数据上下文和模板实例?

  13. 13

    如何在不依赖JavaScript中的ID,类或内容的情况下查找和检索节点位置

  14. 14

    如何在不使用存储库的情况下共享EntityFramework 6数据上下文?

  15. 15

    如何在不传递上下文的情况下读取添加到DbContext的实体

  16. 16

    如何在没有保持上下文的功能的情况下重复 PHP 中的代码块?

  17. 17

    如何在不违反依赖注入的情况下为单个数据库使用多个上下文

  18. 18

    如何在没有GADT或数据类型上下文的情况下定义列表的Eq实例

  19. 19

    如何使用DNN上的编辑器添加HTML / CSS?如何在不依赖模块的情况下添加标记?

  20. 20

    如何在不访问上下文的情况下从线程更新我的Android SQLite数据库?

  21. 21

    如何在不依赖页面中使用的结构/样式的情况下,在页面上的每个其他元素之上呈现元素?

  22. 22

    如何在没有上下文的情况下访问“克隆站点对象”?

  23. 23

    如何在不显式提供动作上下文的情况下更改深层嵌套的状态?

  24. 24

    流星-如何在不丢失上下文的情况下重试失败的HTTP请求?

  25. 25

    如何在没有任何请求,会话等的情况下获取上下文?

  26. 26

    如何在没有上下文的情况下导航?

  27. 27

    如何在没有上下文管理器的情况下连接到WebSocket?

  28. 28

    流星-如何在不丢失上下文的情况下重试失败的HTTP请求?

  29. 29

    如何在没有任何请求,会话等的情况下获取上下文?

热门标签

归档