实体框架的存储库 + 工作单元模式

本文关键字:工作 单元 模式 框架 存储 实体 | 更新日期: 2023-09-27 17:56:59

我在网上上下搜索,但我没有设法找到适合我的应用程序的设计。
我正在寻找存储库+工作单元模式,该模式将管理连接并在完成后自动处理它们。

我需要支持Web应用程序,其中每个请求都有自己的Work单元和Windows应用程序,其中每个线程都有自己的工作单元。我需要模式自动处理工作单元 whrn 请求/线程已完成。我也想在异常情况下支持回滚。

现在我使用StructureMap,所以我不在乎继续在建议答案中使用它。

我需要存储库模式的原因是实现我所有实体所需的所有功能。我需要 UnitOfWork 的原因是允许在多个实体中进行更改。

我真的会感谢任何帮助。

谢谢。

实体框架的存储库 + 工作单元模式

我用这个博客作为一个非常好的起点:

http://www.primaryobjects.com/CMS/Article122.aspx

它从最开始,并在最后为您提供源代码。 它还使用StructureMap,所以你可能有点熟悉。

我会推荐NCommon 框架。 你可以在这里找到一个关于它的博客:http://www.codeinsanity.com/

我去年写了一篇关于编写启用 LINQ 的存储库的文章,这些存储库可以很容易地伪造以进行单元测试,并且可以很好地与依赖项注入配合使用。这是文章。简而言之,本文介绍了一个工作单元,它模拟 LINQ to SQL DataContext并包装一个抽象实际 O/RM 工具的IDataMapper接口。工作单元包含类型Repository<TEntity>的属性,如Repository<Customer>Repository<Order>,存储库类实现IQueryable<T>,这允许您对其进行 LINQ。

IDataMapper是一个简单的界面,如下所示:

public interface IDataMapper : IDisposable
{
    Repository<T> GetRepository<T>() where T : class;
    void Save();
}

本文中描述的解决方案旨在对单元测试友好且对 DI 友好。实际上,您需要的唯一配置如下:

string northwindConnection = GetConStr("Northwind");
container.RegisterSingle<IUnitOfWorkFactory<NorthwindUnitOfWork>>(
    new LinqToSqlNorthwindUnitOfWorkFactory(northwindConnection));
container.RegisterSingle<IUnitOfWorkFactory<SalesUnitOfWork>>(
    new EntityFrameworkSalesUnitOfWorkFactory());

如果您已经有了工作单元和存储库,并且正在使用StructureMap,那么问题出在哪里?

您可以简单地将类配置为:

ObjectFactory.Configure(x => x.For<IUnitOfWork>()
                              .HybridHttpOrThreadLocalScoped()
                              .Use<EFUnitOfWork>());

您可以使用依赖注入将工作单元传递到存储库。