SharpRepository EF5,如何共享数据库上下文
本文关键字:共享 数据库 上下文 EF5 何共享 SharpRepository | 更新日期: 2023-09-27 18:03:00
使用SharpRepository的EF5实现,在使用RepositoryFactory时,如何在IRepository的不同安装之间共享DBContext?
代码片段:
using SharpRepository.Repository;
public class PersonManager()
{
private IRepository<Domain.PersonIdentifier, int> personIdentifierRepository;
private IRepository<Domain.NextNumber, string> nextNumberRepository;
public PersonManager()
{
//HOW TO SHARE A SINGLE DBCONTEXT INSTANCE BETWEEN THESE TWO INSTANTIATIONS ??
this.personIdentifierRepository = RepositoryFactory.GetInstance<Domain.PersonIdentifier, int>();
this.nextNumberRepository = RepositoryFactory.GetInstance<Domain.NextNumber, string>();
}
}
Web.config文件:
<sharpRepository>
<repositories default="EF5Repo">
<repository name="EF5Repo" connectionString="MyContainer" factory="SharpRepository.Ef5Repository.Ef5ConfigRepositoryFactory, SharpRepository.Ef5Repository" />
</repositories>
<cachingProviders default="inmemory">
<cachingProvider name="inmemory" factory="SharpRepository.Repository.Caching.InMemoryConfigCachingProviderFactory, SharpRepository.Repository" />
</cachingProviders>
<cachingStrategies default="noCaching">
<cachingStrategy name="timeout" timeout="30" factory="SharpRepository.Repository.Caching.TimeoutConfigCachingStrategyFactory, SharpRepository.Repository" />
<cachingStrategy name="standardCachingStrategy" generational="true" writeThrough="true" factory="SharpRepository.Repository.Caching.StandardConfigCachingStrategyFactory, SharpRepository.Repository" />
<cachingStrategy name="noCaching" factory="SharpRepository.Repository.Caching.NoCachingConfigCachingStrategyFactory, SharpRepository.Repository" />
</cachingStrategies>
</sharpRepository>
感谢
RepositoryFactory和配置位相对较新,不幸的是,目前还没有包含共享单个DbContext的方法,但我将把它作为一个功能请求添加,只需要想一想实现它的最佳方法。
话虽如此,以下是我现在将如何处理它。在我们实现这个新功能之前,您可以使用Ef5Repository硬编码,而不是使用RepositoryFactory。Ef5Depository构造函数中的第一个参数是DbContext,因此您可以将相同的参数传递到两个存储库中。
不确定您是否使用像StructureMap这样的IOC容器,但如果是这样,您可以将其设置为处理为每个线程或.NET请求创建单个DbContext(如果是web应用程序(。
StructureMap配置如下所示:
// Hybrid (once per thread or ASP.NET request if you’re in a web application)
For<DbContext>()
.HybridHttpOrThreadLocalScoped()
.Use<MyEntities>()
.Ctor<string>("MyContainer").Is(entityConnectionString);
然后你的人事经理会看起来像:
using SharpRepository.Repository;
public class PersonManager()
{
private IRepository<Domain.PersonIdentifier, int> personIdentifierRepository;
private IRepository<Domain.NextNumber, string> nextNumberRepository;
public PersonManager(DbContext dbContext)
{
this.personIdentifierRepository = new Ef5Repository<Domain.PersonIdentifier, int>(dbContext);
this.nextNumberRepository = new Ef5Repository<Domain.NextNumber, string>(dbContext);
}
}
不幸的是,在这一点上,您正在对存储库的类型进行硬编码,并且没有获得配置文件的好处,但我们很快就会获得该功能。谢谢
SharpRepository 1.2版更新
SharpRepository的1.2版(于2014年3月发布(修复了此问题。现在,您可以告诉SharpRepository您正在使用的IoC容器,它将使用它来创建DbContext。这允许您控制DbContext的生命周期,并在多个存储库中共享它。
第一步是为您正在使用的IoC容器获取NuGet包。在NuGet中搜索SharpRepository.Ioc,你会看到我们已经创建并开箱即用的5个Ioc包(Autofac、Ninject、StructureMap、Unity和Windsor(,如果你使用的是我们现在没有涵盖的不同Ioc,你总是可以创建自己的Ioc。
安装后,您需要在App_Start代码、Global.asax或引导程序代码中设置RepositoryDependencyResolver,以便在应用程序启动时运行。以下是使用StructureMap时的操作方法。
RepositoryDependencyResolver.SetDependencyResolver(new StructureMapDependencyResolver(ObjectFactory.Container));
我告诉它使用StructureMap并传入Container。然后你只需要确保IoC已经设置好,并且知道如何处理DbContext的请求。(有关在StructureMap中使用ASP.NET请求生命周期的示例,请参见上文(