2017-06-16 4 views
0

この質問はすでに2010年に尋ねられましたが、今日はより良い回答があるかもしれないと思います。 基本的には、何らかのオブジェクトを格納してすべての要求にアクセスする必要があります。理想的には、要求内からそのオブジェクトを変更できるようにしたいと考えています(MVarまたはIORefがそうするでしょう)。Snap Frameworkを使用してサーバーサイドにオブジェクトを保存するにはどうすればよいですか?

スナップショットチュートリアルでは、可能性があると思われるようですが、スナップレットの使い方がほとんど説明されています(このチュートリアルは結局のためのものです)、この「App」オブジェクトの動作や保存方法。私はスナップレットを必要としない私のケースにそれをどのように適用するか分かりません(私はAPIを作っているので、Heistは必要ありません)。

ので、デフォルトのコード与えられた:私はどこかに私がsomeHandlerに使用できることをいくつかのオブジェクトを「登録」し、これを変更するにはどうすればよい

site :: Snap() 
site = do 
    ifTop (writeBS "hello world") <|> 
    route [ ("stuff/:param", someHandler) ] <|> 
    dir "static" (serveDirectory ".") 

を? 2010年の答えは、すべてのハンドラに部分的に適用するだけですが、これはうまくいくはずですが、Snapletチュートリアルではより良い方法が必要だと思っています。

+0

あなたが参照している回答にリンクを追加できますか? –

+0

ああ、申し訳ありません:https://stackoverflow.com/questions/3903205/how-do-i-maintain-a-server-side-state-with-snap-framework – Ulrar

+0

ほとんどすべてのスナップ関数は戻り値の型 ' MonadSnap m => .. - > m X'。だからインスタンス 'MonadSnap m => MonadSnap(ReaderT m)'(すでに存在しない場合)を作成し、環境を明示的に渡す必要はありません。 – user2407038

答えて

0

スナップショットチュートリアルの「Working with State」セクションでは、ローカルステートの操作方法について説明しています。上記の「スナップレットの概要」セクションの2番目のコードを見ると、Lensを使用してデータタイプを初期化するときの状態の設定方法がわかります。

あなたがこれらのことにどれほど親しんでいるのかよく分かりませんが、Lensでは大きな値のデータにアクセス(つまり読み書き/調整)することができます。この場合のサーバーの状態全体は、サーバーが存在するときに初期化されるデータの1つのブロブ(レコードタイプ値)として表されます。

注意:_companyName :: IORef B.ByteString <は、この例では変更可能な状態であり、「状態を処理する」というセクションが変更されています。彼らはそのURLにHTTP GETまたはPOSTを受け取り、新しい "name"パラメータ(POST)でそれを更新して新しい状態を返すか、GETの場合は現在の状態を返します。

+0

私が正しく理解するならば、基本的にあなたはあなたのアプリ全体をスナップショットにして状態を取得する必要があります。私は本当にスナップレットを使用していないので、パフォーマンスに影響を与えないと思っています。私の場合、ちょっと不思議なことではありません。 – Ulrar

+0

Snapについての私の理解は、特定のバージョンから**すべての**はすべてのアプリケーションプログラマレベルの懸念事項のベースレベルの抽象化であるスナップショットで構築されています。これはモジュール性を提供し、非常に効率的です。レンズは極めて基本的なレコード上の非常に軽量のデータアクセスです。スナップレットは、その中核となる状態についてのものです。したがって、スナップショットは、スナップアプリケーションに状態を取得する標準的な方法です。それは私の理解から、速く、効率的ですが、なぜいくつかのプロファイリングをしないでください:) –

関連する問題