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>

感谢

SharpRepository EF5,如何共享数据库上下文

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请求生命周期的示例,请参见上文(