2

ウィンザー、ファシリティ、nhibernateを使用したアプリケーションの構成に問題があります。

この例外が発生しています:

ObjectDisposedException: Session is closed   

ウィンザーは、リクエストごとにセッションをインスタンス化し、このような構成になっているときに開く必要がありますか?いくつかの構成を見逃してもいいですか?これが私の構成です:

public class PersistenceFacility : AbstractFacility
{

    protected override void Init()
    {
        Configuration config = BuildDatabaseConfiguration();

        Kernel.Register(
            Component.For<ISessionFactory>()
                .LifeStyle.Singleton
                .UsingFactoryMethod(config.BuildSessionFactory),
            Component.For<ISession>()
                .LifeStyle.PerWebRequest
                .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()));
    }

    private Configuration BuildDatabaseConfiguration()
    {
        return Fluently.Configure()
            .Database(SetupDatabase)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<RnUlice>())
            .ExposeConfiguration(ConfigurePersistence)
            .BuildConfiguration() ;
    }
   ......
}
4

2 に答える 2

7

コンストラクターで ISessionをRepository<T>取得し、それがシングルトン (デフォルトのライフスタイル) である場合、リポジトリを呼び出す最初のリクエストでのみ機能します。後続のリクエストでは、リポジトリは最初の呼び出しと同じ ISession を保持しますが (リポジトリがシングルトンであるため)、そのセッションは現在閉じられており、使用できないため、エラーが表示されます。

これが、ほとんどの場合、「より短い」ライフスタイルを持つ他のコンポーネント (Web リクエストごとや一時的なものなど) に依存するシングルトンを必要としない理由です。

一般的なライフスタイルの問題のより詳細な分析については、この記事を参照してください。

于 2011-06-20T20:13:43.827 に答える
2

私は何が間違っているかを理解しました。リポジトリのライフスタイルを Transient に設定するのを忘れていました。これがどのように問題なのかよくわかりません。

            container.Register(Component.For(typeof(IRepository<>))
                                    .ImplementedBy(typeof(Repository<>)).LifeStyle.Transient);

それでは、デフォルトのライフスタイルは何だろうか?私はそれがシングルトンであることをドキュメントで読んでいました?! それがどうして問題になるのでしょうか?

于 2011-06-20T16:47:45.843 に答える