实体框架的存储库 + 工作单元模式
本文关键字:工作 单元 模式 框架 存储 实体 | 更新日期: 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>());
您可以使用依赖注入将工作单元传递到存储库。