我正在使用Entity Framework(代码优先),存储库和工作单元模式,基本上如下所述: Entity Framework 4 CTP 4 / CTP 5 Generic Repository Pattern and Unit Testable
我也在使用StructureMap来管理我的对象实例,我有一些像这样的代码连接EF dbcontext和工作单元:
For<DbContext>().HybridHttpOrThreadLocalScoped().Use<MyDbContext>();
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
我还有一个当前知道Repository<T>
实例的通用MyDbContext
。现在我需要能够支持多个数据库,从而支持多个DbContexts。我正在考虑尝试将IUnitOfWork
调整为IUnitOfWork<T>
,其中T是要使用的DbContext
。但我的存储库还需要知道要使用哪个DbContext
,那么我是否必须使其具有双重通用性(例如Repository<TEntity,TDbContext>
)?
使用我正在使用的UnitOfWork模式支持多个数据库的最佳,最简单的方法是什么?
答案 0 :(得分:0)
这取决于您的应用程序逻辑。您是否打算使用单个工作单元对多个数据库进行更改?如果是,您仍应对在该工作单元内访问的每个数据库使用一个工作单元和数据库工厂。该工作单元的提交应使用TransactionScope
以原子方式对所有数据库进行更改(这可能会更具挑战性)。
如果您始终只需要在单个数据库中进行更改,则可以使用单个通用工作单元,但您还必须在数据库工厂上实现通用Get
。不需要将上下文类型传递到存储库。将初始化逻辑移动到具体的存储库,这些存储库知道它们必须使用的上下文类型,并且它们会向数据库工厂询问该上下文。