实体框架的存储库+ UnitOfWork模式

时间:2011-05-17 19:28:20

标签: c# .net entity-framework repository-pattern unit-of-work

我上下搜索网络,我无法为我的申请找到合适的设计 我正在寻找Repository + UnitOfWork模式,它将管理连接并在完成后自动处理它们。

我需要支持Web应用程序,其中每个请求都有自己的UnitOfWork和Windows应用程序,其中每个线程都有自己的UnitOfWork。我需要模式自动处理请求/线程完成后的UnitOfWork。 我也想在异常的情况下支持rolback。

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

我需要Repository模式的原因是为了实现我所有实体所需的所有能力。 我需要UnitOfWork的原因是允许更多的实体进行更改。

我会非常感激任何帮助。

感谢。

4 个答案:

答案 0 :(得分:3)

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

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

它从非常开始,并在最后为您提供源代码。它也使用StructureMap,所以你可能对它很熟悉。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

去年我写了一篇关于编写支持LINQ的存储库的文章,这些存储库可以很容易地伪造成单元测试,并且可以很好地处理依赖注入。 Here is the article。简而言之,本文描述了一个工作单元,它模仿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());

答案 3 :(得分:0)

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

您可以简单地将您的课程配置为:

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

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