Haskell, Snap: Einfache Snaplet-Konstruktion. Wann verwenden wir Snaplet und wann Bibliothek?

8

Ich versuche die einfache Snaplet-Konstruktion zu verstehen. Auch, wann muss ich eigentlich einen Snaplet machen und wann eine einfache Side-Library? Und wenn ich einen brauche, wie mache ich es aus einer Bibliothek heraus?

Zum Beispiel habe ich eine Reihe von DB-Funktionen, in denen ich meinen SQL-Code wie folgt einpacke.

%Vor%

Jede Funktion initiiert eine neue Verbindung und schließt die Verbindung nach dem Festschreiben. Ich denke, ein Snaplet zu machen ist der Weg, die Verbindung in jeder Funktion zu vermeiden? In meinem Handler würde ich es so verwenden:

%Vor%

Es funktioniert so weit. Meine Frage (n) ist / sind: Wann muss ich eine Bibliothek tatsächlich zu einem Snaplet machen? Muss ich meine einfache DB-Bibliothek in ein Snaplet umwandeln, nur um die Verbindung zu initialisieren, anstatt die Verbindung in jeder Funktion herzustellen?

Wenn ich jetzt den Schnapper mache ... Auf der Snap-Website gibt es ein kleines Beispiel für ein Top-Level-Snaplet, aber es gibt keine Spur davon, wie man einfach Pluggle-Snaplets erstellen kann.

Also habe ich meiner DB-Bibliothek die Snaplet-Initialisierungsfunktion hinzugefügt

%Vor%

Ist das der richtige Weg? Ist das alles, was ich brauche, um es zu einem Pluggble Snaplet zu machen?

Dann staple ich diesen DB-Snaplet in die Haupt-App

%Vor%

Jetzt habe ich nur noch die Verbindung, die meinen Request-Handlern zur Verfügung steht, oder? Also mein Handler wird:

%Vor%

Das scheint nicht zu funktionieren. Was mache ich falsch? Ist dies der richtige Weg, um die Verbindung aus dem Snapleet-Handle (dbcon) zu extrahieren? Ist das in der Regel die richtige Richtung, um ein einfaches Snaplet zu konstruieren? Brauche ich in meinem Fall tatsächlich ein Snaplet?

Danke.

    
r.sendecky 30.03.2012, 02:45
quelle

1 Antwort

3

Handler ist eine Instanz von MonadState : MonadState v (Handler b v) .

Handler ist auch eine Instanz von MonadSnaplet und stellt daher die Methode with bereit:
with :: Lens v (Snaplet v') -> m b v' a -> m b v a

dbcon ist ein Lens App (Snaplet Connection) .

Um zum Connection zu kommen, können wir folgendes verwenden:
conn <- with dbcon get

Normalerweise würden Sie einen Snaplet erstellen, wenn Sie Funktionen bereitstellen, von denen jeder profitieren könnte. In Ihrem Fall ist es wahrscheinlich am besten, den HDBC-Snaplet zu nutzen, mit dem Sie sich mit einer sqlite3-Datenbank verbinden können.

Checkout Ссылка für ein gutes Tutorial zur Verwendung des HDBC-Snaplet.

    
qubital 30.03.2012, 04:06
quelle

Tags und Links