4

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>

ありがとう

4

1 に答える 1

3

RepositoryFactoryと構成ビットは比較的新しく、残念ながら現在、単一のDbContextを共有する方法は含まれていませんが、それを機能要求として追加し、それを実現するための最良の方法を考える必要があります。

そうは言っても、これが私が今それをどのように扱うかです。この新しい機能を実装するまで、RepositoryFactoryを使用する代わりに、Ef5Repositoryを使用してハードコーディングすることができます。Ef5Repositoryのコンストラクターの最初のパラメーターはDbContextであるため、同じパラメーターを両方のリポジトリーに渡します。

StructureMapのようなIOCコンテナーを使用しているかどうかはわかりませんが、使用している場合は、スレッドごとに1つのDbContextを作成するか、Webアプリケーションの場合は.NETリクエストを処理するように設定できます。

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);

その場合、PersonManagerは次のようになります。

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(3/14にリリース)はこの問題を修正します。これで、SharpRepositoryに使用しているIoCコンテナを伝えることができ、それを使用してDbContextを作成します。これにより、DbContextのライフサイクルを制御し、複数のリポジトリ間で共有できます。

最初のステップは、使用しているIoCコンテナーのNuGetパッケージを取得することです。NuGetでSharpRepository.Iocを検索すると、作成されてすぐに処理される5つのIoCパッケージ(Autofac、Ninject、StructureMap、Unity、Windsor)が表示されます。使用している場合は、いつでも独自のパッケージを作成できます。現在カバーしていない別のIoC。

インストールしたら、App_Startコード、Global.asax、またはbootstrapperコードでRepositoryDe​​pendencyResolverを設定して、アプリケーションの起動時に実行されるようにする必要があります。StructureMapを使用する場合の方法は次のとおりです。

RepositoryDependencyResolver.SetDependencyResolver(new StructureMapDependencyResolver(ObjectFactory.Container));

StructureMapを使用してコンテナを渡すように指示しています。次に、IoCがセットアップされ、DbContextの要求を処理する方法を知っていることを確認する必要があります。(StructureMapでASP.NET要求のライフサイクルを使用する例については、上記を参照してください)

于 2013-03-07T16:45:04.827 に答える