我上下搜索网络,我无法为我的申请找到合适的设计 我正在寻找Repository + UnitOfWork模式,它将管理连接并在完成后自动处理它们。
我需要支持Web应用程序,其中每个请求都有自己的UnitOfWork和Windows应用程序,其中每个线程都有自己的UnitOfWork。我需要模式自动处理请求/线程完成后的UnitOfWork。 我也想在异常的情况下支持rolback。
现在我使用StructureMap,所以我不想继续在建议答案中使用它。
我需要Repository模式的原因是为了实现我所有实体所需的所有能力。 我需要UnitOfWork的原因是允许更多的实体进行更改。
我会非常感激任何帮助。
感谢。
答案 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>());
您可以使用依赖注入将工作单元传递给存储库。