2

できるだけ短い長い物語...

新しい API を作成するために ServiceStack を取得しようとしている既存のアプリケーションがあります。このアプリは現在 MVC3 アプリであり、MVC ルートで属性インジェクションを使用して UnitOfWork パターンを使用して、属性が適用されるトランザクションを作成/終了します。

ServiceStackを使用して同様のことを達成しようとしています

この要点 は、関連する ServiceStack 構成設定を示しています。私が興味を持っているのは、グローバルな要求/応答フィルターです。これらは、要求ごとに新しい作業単位を作成し、クライアントに応答を送信する前に閉じます (そこにチェックがあるため、エラーが発生した場合はデシベル、クライアントに適切な応答を返します。偽の「成功」メッセージではありません)

私の質問は次のとおりです。

  1. これは良いアイデアですか、それとも ServiceStack でこれを行うためのより良い方法はありますか。
  2. MVC サイトでは、データを追加/更新/削除するアクションで新しい作業単位を作成するだけです。ここで同様のことを行う必要がありますか、それともデータを取得するためだけにトランザクションを作成しても問題ありませんか?
4

2 に答える 2

3

ServiceStack の IOC wikiで述べ​​たように、Funq IOC は依存関係をデフォルトでシングルトンとして登録します。したがって、RequestScope に登録するには、次のように指定する必要があります。

container.RegisterAutoWiredAs<NHibernateUnitOfWork, IUnitOfWork()
    .ReusedWithin(ReuseScope.Request);

シングルトンとして登録されるため、これはおそらくあなたが望むものではありませんが、つまり、すべてのリクエストに対して同じインスタンスが返されます。

container.Register<ISession>((c) => {
    var uow = (INHibernateUnitOfWork) c.Resolve<IUnitOfWork>();
    return uow.Session;
});

あなたはおそらくこれを作りたい:

    .ReusedWithin(ReuseScope.Request); //per request

    .ReusedWithin(ReuseScope.None); //Executed each time its injected

を使用するRequestScopeと、サービスで使用されているものと同じインスタンスを取得するグローバル リクエスト/レスポンス フィルタでも機能します。

于 2013-01-11T05:05:35.540 に答える
0

1) ServiceStack、MVC、WCF、Nancy、またはその他のWebフレームワークを使用しているかどうかに関係なく、使用する最も一般的な方法は、要求ごとのセッションパターンです。Web用語では、これは、要求の最初に新しい作業単位を作成し、要求の最後に作業単位を破棄することを意味します。ほとんどすべてのWebフレームワークには、これらのイベントへのフックがあります。

資力:

2)トランザクション内では常にNHibernateと対話する必要があります。

理由の説明については、次のいずれかを参照してください。

読み取りでトランザクションを使用するように切り替えるときは、NULLの動作に注意してください:http ://www.zvolkov.com/clog/2009/07/09/why-nhibernate-updates-db-on-commit- of-read-only-transaction /#comments

于 2013-01-10T23:17:37.083 に答える