6

Castle と wcf を使用してこの NHibernatefacility のことを理解しようと 3 日間試みてきましたが、本当にイライラしています。

十数個のエラーを解決した後、かなり明らかなエラーにたどり着きましたが、解決できません。

これは私の global.asax の Application_Start です

        container.AddFacility<AutoTxFacility>();
        container.Register(Component.For<INHibernateInstaller>().ImplementedBy<NHibernateInstaller>());
        container.AddFacility<NHibernateFacility>();
        container.AddFacility<WcfFacility>();

        container.Register(
            Component.For<IAuthService>().ImplementedBy<AuthService>().LifestylePerWcfOperation(),
            Component.For<IUserRepository>().ImplementedBy<UserRepository>().LifestylePerWcfOperation(),
            Component.For<IActionWebService>().ImplementedBy<ActionWebService>().Named("ActionWebService").LifestylePerWcfOperation(),
            Component.For<ISession>().LifeStyle.PerWcfOperation().UsingFactoryMethod(x => container.Resolve<ISessionManager>().OpenSession()));

これは最初のリクエストで機能します。その後、このエラーが発生します。

工場は廃棄され、使用できなくなりました。オブジェクト名: 「これ」。

この行のユーザーリポジトリでエラーが発生しています

[Transaction]
        public virtual User GetUserByCredentials(string email, string password)
        {
            using (var tx = session())
            {
                return tx.QueryOver<User>().Where(x => x.Email == email && x.Password == password).SingleOrDefault();
            }
        }

これはライフスタイルと関係があると感じています。複数の組み合わせを試しましたが、うまくいきませんでした。この時点で何をすべきかわかりません。私はすべての設備 (生活を楽にするはずの) を備えたこのキャッスルに乗り込みましたが、ドキュメントがないために非常に複雑です。これらすべてをまとめて実装するための降下ガイドを見つけることができませんでした.4歳ではないことは言うまでもありません.

助けてください!

4

1 に答える 1

1

以前にこの質問を見つけられなかったことをお詫び申し上げます。

このエラー メッセージが表示される最も可能性の高い理由は、ISession を再登録していることです。施設のポイントは、そのサポートを提供することです。

ISessionをシングルトンに設定したというコメントも読みました。単一の障害が発生すると、クラッシュして書き込みが発生し、完全なコンテナーを破棄する必要があります (ほとんどの場合、アプリケーションの構成ルートであるため、アプリケーションを再起動する必要があります)。 .

この機能のポイントは、AOP ベースのトランザクションを提供することです。次に、トランザクションをできるだけ GUI またはコマンド レイヤーに近づける必要があります。読み取りなどの子操作は、[Transaction]操作のトランザクション境界を示さないため、単一のトランザクションでラップしないでください。

代わりに、サーフェス API を調べて、ACID で実行されるはずのメソッドが呼び出されている場所を確認してください。ここに属性を配置します。


あなたの場合、トランザクションの境界は WCF 呼び出しの周りにあるようです。あなたがする必要があるのは、ISession が登録されているライフスタイルを置き換えることです。

NHibernateFacility の c'tor を見ると、一時的なライフスタイルを渡すオプションが見つかります。ISession に依存するすべてのコンポーネントが一時的である場合は、コンポジション ルート/コンテナーから取得されたオブジェクトが存続している間だけ存続することが保証されているため、ISession の一時的なライフスタイルを使用することをお勧めします。

「本当の」修正は、既存の 3 つのライフスタイルの場合と同様に、私の github から機能を拡張することです。

于 2012-12-28T20:32:30.693 に答える