3

私はCastleWindsor、Nhibernate、Fluent、Automappingスタック全体に慣れていないので、ここで私の無知を許してください。Windsor nhib Isession管理の問題を解決しようとする質問はすでに多数あるように思われるため、これについて別の質問を投稿したくありませんでしたが、これまでのところ、いずれも私の問題を解決していません。リポジトリからDbを呼び出そうとすると、ISessionが閉じた例外が発生します。これがコンテナのセットアップコードです。

container.AddFacility<FactorySupportFacility>()
            .Register(
                Component.For<ISessionFactory>()
                    .LifeStyle.Singleton
                    .UsingFactoryMethod(() => Fluently.Configure()
                                                  .Database(
                                                      MsSqlConfiguration.MsSql2005.
                                                          ConnectionString(
                                                              c => c.Database("DbSchema").Server("Server").Username("UserName").Password("password")))
                                                  .Mappings
                                                     (
                                                      m => 
                                                      m.AutoMappings.Add
                                                        (
                                                          AutoMap.AssemblyOf<Message>(cfg)
                                                          .Override<Client>(map =>
                                                          {
                                                              map.HasManyToMany(x => x.SICCodes).Table("SICRefDataToClient");
                                                          })
                                                          .IgnoreBase<BaseEntity>()
                                                          .Conventions.Add(DefaultCascade.SaveUpdate())
                                                          .Conventions.Add(new StringColumnLengthConvention(),new EnumConvention())
                                                          .Conventions.Add(new EnumConvention())

                                                          .Conventions.Add(DefaultLazy.Never())
                                                        )
                                                      )
                                                  .ExposeConfiguration(ConfigureValidator)
                                                  .ExposeConfiguration(BuildDatabase)
                                                  .BuildSessionFactory() as SessionFactoryImpl),
                 Component.For<ISession>().LifeStyle.PerWebRequest.UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession()
                                                  ));

私のリポジトリでは、次のように注入private readonly ISession session;して使用します

 public User GetUser(int id)
    {
        User u;

            u = session.Get<User>(id);
            if (u != null && u.Id > 0)
            { 
                NHibernateUtil.Initialize(u.UserDocuments);
            }


        return u;

内の私のweb.configで<httpModules>。私もこの行を追加しました

      <add name="PerRequestLifestyle" 
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/>

私はまだここでパズルの一部を見逃しています。これが、nHibernateとCastleWindsorを使用したWebアプリケーション開発の基本的なニーズに合わせて構成するのにこれほど複雑なことだとは信じられません。

私はここのコードに従おうとしていますwindsor-nhibernate-isession-mvcまったく同じ問題があるように見えたので、そこに質問を投稿しましたが、私の質問は解決されていません。

UPDATE MooKid8000私は今、私の城の登録コードをこれに更新しました

private void AddRepositories()
    {
        container.Register(
            AllTypes.FromAssembly(typeof(MembershipRepository).Assembly)
                .Pick()
                .Configure(c => c.Interceptors(
                    InterceptorReference.ForKey("simpleLogger")).Anywhere
                )
                .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
                .WithService.FirstInterface());
    }

しかし、まだISessionがクローズされている問題が発生しています。サービスも一時的なものとして登録する必要がありますか。シングルトンではなく一時的なものにする必要がある理由を詳しく説明してください。

UPDATE MooKid8000の提案は100%正しかったので、ISessionが消去されないように、すべてがLifestyleType.Transientとしてスコープされているサービスとリポジトリを確認する必要があります。私の城の登録コードを最初に見なくても素晴らしいスポットMookid8000。

興味のある方は私に連絡してください。コンテナのセットアップをお送りします。

4

1 に答える 1

5

リポジトリを一時的なライフスタイルに登録することを覚えていますか?

リポジトリがシングルトン(Windsorのデフォルトのライフスタイル)の場合、注入されたISessionインスタンスは「キャッチ」され、後でクローズセッションエラーが発生します。

リポジトリを使用するサービスは、一時的なライフスタイルである必要があり、それらのサービスを使用するサービスも同様である必要があることに注意してください。

一般に、構成のルートから離れるにつれてライフスタイルの粒度が上がることはないと言えます。そうしないと、何らかのスコープが発生します。もちろん、これは必ずしも問題ではありませんが、診断が非常に難しいエラーにつながる可能性があります。

于 2010-12-30T08:50:25.360 に答える