UnitOfWork + Repository 模式和实体框架模拟

Posted

技术标签:

【中文标题】UnitOfWork + Repository 模式和实体框架模拟【英文标题】:UnitOfWork + Repository patterns and Entity Framework impersonation 【发布时间】:2011-11-30 18:37:24 【问题描述】:

我在我的 EF 应用程序中使用了 UnitOfWork 和 Repository 模式。

实际上,我的设计规定 UnitOfWork 将创建 ObjectContext 类并注入到 Repository 具体类中。例如:

UnitOfWork.cs(初始化)

public DefaultUnitOfWork() 
    if (_context == null) 
        _context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
    

UnitOfWork.cs(获取存储库实例)

public CustomerRepository Customers 
    get 
        if (_customers == null) 
            _customers = new CustomerRepository(_context);
        
        return _customers;
    

这样,Repository 类已经定义了一个 ObjectContext 类,它们可以使用它的方法来检索和更新数据。 这很好用。

现在我需要执行模拟应用程序池标识的查询,因此我决定将代码包装在模拟中的 UnitOfWork 的构造函数中。

不幸的是,这不起作用,因为 ObjectContext 然后被传递给存储库构造函数,并在存储库的客户端调用时使用,例如 FindAll()

我体验到,与数据库的真正连接是在 Entity Framework 进行查询之前建立的,而不是在我创建 ObjectContext 本身时建立的。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以使用一个或多个 ObjectContext 工厂(创建 ObjectContext),使用不同的创建标准,例如连接字符串。您的 UnitOfWork 可以利用工厂来获取其上下文,存储库也可以,但我认为如果 UnitOfWork 使用的 ObjectContext 与您的存储库不同,您就错过了它的意义。

一个 UnitOfWork 应该由一个或多个应该一起完成的操作组成,这可以轻松利用多个存储库。如果存储库有自己的与 UnitOfWork 分开的 ObjectContexts,我看不出提交 UnitOfWork 将如何实现其目的。

我认为要么我完全误解了你的问题,要么你遗漏了一些相关的细节。祝你好运!

【讨论】:

以上是关于UnitOfWork + Repository 模式和实体框架模拟的主要内容,如果未能解决你的问题,请参考以下文章

如何使用通用存储库实现 ADO.NET?

UnitOfWork 是不是等于事务?还是不止于此?

无法模拟unitOfWork和没有服务接口

.NetCore基于SqlSugar的工作单元—UnitOfWork

UnitOfWork知多少

如何解决 Dapper - UnitOfWork 事务错误