Προγραμματισμός με Beerway στο F # [2]

Εισαγωγή

Σε αυτό το blogpost συνεχίζουμε εκεί που απομακρύνθηκε από το προηγούμενο blogpost. Στόχος μας είναι να κάνουμε τα εξής:

  1. Ρυθμίζοντας τα κυκλώματα, έτσι δεν συνεχίζεται κανένα από τα υπερβολικά σκληρά κωδικοποιημένα mumbo-jumbo. Θα σώσουμε τις διαμορφώσεις μας που θα φορτωθούν κατά την εκκίνηση της διαδικασίας από το MongoDb μέσω MLab. Η μόνη σκληρή κωδικοποιημένη τιμή θα είναι αυτή της συμβολοσειράς σύνδεσης για σύνδεση με το διακομιστή Mongo.
  2. Γενικεύοντας τον προγραμματιστή για να εκτελέσετε τον αγωγό για πολλούς ζυθοποιούς.
  3. Προγραμματισμός της διαδικασίας για την έγκαιρη εκτέλεση.
  4. Ανθεκτικές εξαγνώσεις μέσω του MongoDb.

Θα κάνουμε δοκιμές χρησιμοποιώντας το Expecto και προσθέτοντας την καταγραφή μέσω Logary στο 3ο blogpost αυτής της σειράς.

Προκαταρκτικά

Έλαβα ένα μεγάλο δείκτη για το χειρισμό της υπόθεσης NoDifference από τον Atle Rudshaug. θα πρέπει να αντιμετωπίσουμε την περίπτωση NoDifference ως επιτυχία, δηλαδή εάν δεν βρεθεί καμία διαφορά, μην στείλετε ένα κείμενο έξω.

Η τροποποιημένη Μονάδα Σφάλματος τώρα μοιάζει με:

Συγκρίνετε τη λειτουργία, η οποία απλώς διοχετεύει τη διαφορά μεταξύ της τρέχουσας και της προηγούμενης κοπής.

Η λειτουργία ειδοποίησης έχει πλέον το βάρος να διακρίνει εάν θα στείλει ή όχι ένα κείμενο με βάση την καρδιανότητα της διαφοράς.

Επιπλέον, θα προσθέσουμε ένα νέο μέλος της συμβολοσειράς τύπου στο αρχείο μας που ονομάζεται "Όνομα" για να προχωρήσουμε προς μια κατεύθυνση γενίκευσης του αγωγού που θα επισημανθεί αργότερα.

Το BeerInfo.fs με τον ενημερωμένο τύπο εγγραφής και τα στατικά μέλη που σχετίζονται με το Chiron μοιάζουν τώρα με:

Διαμόρφωση και γενίκευση

Ας απαλλαγούμε από όλα τα σκληρά κωδικοποιημένα κυριολεκτικά και να γενικεύσουμε τον αγωγό μέσω μιας λίστας ζυθοποιών και όχι μόνο του κουρασμένου χεριού. Μέχρι τώρα έχουμε κάνει καλή δουλειά που χωρίζει τα κοινά στοιχεία. μπορούμε να κάνουμε καλύτερα! Ας μετακινήσουμε όλες τις παραμέτρους στο σύννεφο και γενικεύσουμε την γραμμή pipleline.

Διαμόρφωση

Θα χρησιμοποιήσουμε τη δωρεάν βαθμίδα του MLab για να διατηρήσουμε όλες τις λεπτομέρειες διαμόρφωσης. Ξεκινάμε δημιουργώντας μια βάση δεδομένων που ονομάζεται "beerwayorientedprogramming" και προσθέτοντας τη συλλογή των διαμορφώσεων. αυτό πρέπει να είναι αρκετά απλή διαδικασία. Το UI του MLab είναι φοβερό! Μη διστάσετε να επικοινωνήσετε μαζί μου εάν έχετε προβλήματα.

Η συλλογή ρυθμίσεων, για τώρα, θα πρέπει να περιέχει ένα έγγραφο με τις λεπτομέρειες Twilio. Μπορούμε να αποφασίσουμε αργότερα εάν θέλουμε να προσθέσουμε και άλλα πεδία εδώ.

Η συλλογή ρυθμίσεων, μια φορά που θα επιμείνει, θα είναι παρόμοια με τα ακόλουθα:

{
    "_id": {
        "$ oid": "5976bcc1734d1d6202aa1556"
    },
    "MyPhoneNumber": "ο αριθμός τηλεφώνου σας",
    "AccountSID": "το twilio account sid",
    "AuthToken": "το δελτίο σας twilio auth",
    "SendingPhoneNumber": "ο τηλεφωνικός σας αριθμός αποστολής twilio"
}}

Επικοινωνία με τη βάση δεδομένων

Στη συνέχεια, θα προσθέσουμε την αναφορά mongocsharpdriver και MongoDB.FSharp μέσω του PAKET. Εάν δεν είστε σίγουροι για το πώς να το κάνετε αυτό, ανατρέξτε στην προηγούμενη ανάρτηση που περιέχει πληροφορίες σχετικά με τον τρόπο χρήσης του PAKET και ελέγξτε αν οι σχέσεις εξαρτήσεων έχουν αναφερθεί με επιτυχία.

Θα δημιουργήσουμε μια νέα ενότητα που ονομάζεται Db στο αρχείο Common.fs πριν από τη μονάδα σφάλματος που θα περιέχει όλες τις λειτουργίες που σχετίζονται με τη βάση δεδομένων μας. Επιπλέον, θα εξαλείψουμε όλο τον κώδικα για να αποεπεξεργαστούμε / σειριοποιήσουμε το αρχείο JSON στο οποίο εργαστήκαμε προηγουμένως στη μονάδα Compare.

Το μόνο κυριολεκτικό που πρέπει να κωδικοποιηθεί είναι αυτό της συμβολοσειράς σύνδεσης [αν θέλετε να είστε δημιουργικοί, μπορείτε να το κρατήσετε σε ένα αρχείο διαμόρφωσης χρησιμοποιώντας τη βιβλιοθήκη FSharp.Configuration].

Συνολικά, η Μονάδα Db μοιάζει με:

Περισσότερες λεπτομέρειες σχετικά με τις λειτουργίες Mongo + F # CRUD μπορούν να βρεθούν στο προηγούμενο blogpost μου που μπορείτε να βρείτε εδώ. Και η τροποποιημένη μονάδα ειδοποίησης με διαμόρφωση τώρα μοιάζει με:

Γενίκευση

Ο μόνος συγκεκριμένος κώδικας για τη ζυθοποιία θα ζει στον αναλυτή ειδικού ζυθοποιείου και στο αρχείο που περιέχει την κύρια λειτουργία που θα περιέχει τον αγωγό για τη ζυθοποιία. Θα χρειαστεί να αλλάξετε τη λειτουργική μονάδα Συγκρίνετε για να δημιουργήσετε το αρχείο Json με βάση το όνομα της ζυθοποιίας.

Η αλλαγμένη μονάδα BeerwayOrientedProgramming μοιάζει τώρα με:

Και η λειτουργία αλλαγής σύγκρισης στη μονάδα σύγκρισης τώρα μοιάζει με:

Scheduler

Το επόμενο βήμα είναι να ρυθμίσετε ένα χρονοπρογραμματιστή για να εκτελέσετε το ζυθοποιείοPipelines σε ένα χρονοδιακόπτη. Για αυτό, θα κατεβάσουμε το Quartz.NET για τον προγραμματισμό μέσω του PAKET.

Μετά από αυτό το απόσπασμα F #, είμαστε σε θέση να ρυθμίσουμε εύκολα μια προγραμματισμένη διαδικασία για να περάσουμε από όλα τα ζυθοποιεία και να αναλύσουμε τις λεπτομέρειες κάθε 2 δευτερόλεπτα για πάντα.

Δεν φτάνουμε γύρω μας με την εξαγορά της μπύρας μας, κάνουμε τη διαδικασία κάποιου μπύρας σε μπασκέτα.

Ανθεκτικές γρατζουνιές

Τέλος, ας προσθέσουμε την ικανότητα να συνεχίσουμε τις γρατζουνιές μας στην ίδια βάση δεδομένων MongoDb "beerwayorientedprogramming".

Με το ίδιο πνεύμα γενικεύοντας τη διαδικασία μας για να προσθέτουμε εύκολα και άλλες συσκευές επεξεργασίας ζυθοποιίας, θα ονομάσουμε τις συλλογές της βάσης δεδομένων με βάση το όνομα της ζυθοποιίας, αφού εξαντληθεί η σειριοποίηση JSON και η αποεριοποίηση από και προς ένα αρχείο.

Θα ξεκινήσουμε με την εκσπερμάτωση όλων των παλαιών συνιστωσών σειριοποίησης και αποεπικαλύψεως του JSON επαναλαμβάνοντας τον τύπο εγγραφής BeerInfo και προσθέτοντας το Id MongoDb που είναι τύπου BsonObjectId μετά την αφαίρεση των στατικών μελών με βάση το Chiron.

Η νέα ενότητα BeerInfo μοιάζει με:

Αν παρατηρήσετε, αλλάξαμε τον τύπο των "Beers" από μια λίστα FSharp σε μια από τις System.Generic.Collections μία για λόγους συμμόρφωσης με τον οδηγό C # MongoDb που ο F # ένας χτίστηκε πάνω από.

Τώρα θα καταργήσουμε την αναφορά στον Chiron, αφού δεν το χρειαζόμαστε πια. Αυτό γίνεται με το άνοιγμα της παλέτας εντολών [Cmd + Shift + P] και την πλοήγηση στην αναφορά κατάργησης του PAKET με τον ακόλουθο τρόπο μετά το άνοιγμα του αρχείου fsproj:

Μόλις αφαιρεθεί η αναφορά στον Chiron, θα προσθέσουμε μερικές μεθόδους στην ενότητα Db που σχετίζεται με τη δημιουργία νέων στοιχείων, καθώς και με την απόκτηση του προηγούμενου κομματιού.

Αν υπάρχει εξαίρεση ενώ προσπαθείτε να πάρετε τη συλλογή με το όνομα της ζυθοποιίας, θα προσπαθήσουμε να την αναδημιουργήσουμε στο μπλοκ.

Έχουμε απομακρύνει την πολυπλοκότητα της εμμονής των αποξεσμάτων από τη μονάδα Compare στη μονάδα Db όπου πιάνουμε το τελευταίο ξύσιμο. Ελέγουμε αν το τελευταίο ξυστό είναι μηδέν [αφού το ρίξουμε σε ένα αντικείμενο για να ελέγξουμε την ακαταλληλότητα αφού χρησιμοποιούμε το FirstOrDefault ()].

Η ενημερωμένη μας λειτουργία TiredHandsScraper.scrape θα μοιάζει τώρα με:

με τη λειτουργία getBeerNamesFromTiredHands να μοιάζει με:

Επιπλέον, η ενότητα "Σύγκριση" θα απλουστευθεί σημαντικά:

Είναι θαυμάσιο να επιμείνουμε στα γρατζουνιές μας, κάτι που μπορεί να επιβεβαιωθεί με την εξέταση των εγγράφων μας στη συλλογή TiredHands:

συμπέρασμα

Έχουμε έρθει σίγουρα μακριά προσθέτοντας διαμόρφωση, γενίκευση, προγραμματισμό και επιμονή. Όπως αναφέρθηκε προηγουμένως, η επόμενη και τελευταία θέση αυτής της σειράς θα περιλαμβάνει μερικές δοκιμές και καταγραφή για να ενισχύσει πλήρως αυτή τη φορά την απλή εφαρμογή σε μια πλήρως εξελιγμένη.

Όπως πάντα, εκτιμώ τα σχόλιά σας!