Ang programming na naka-orient sa Beerway sa F # [2]

Panimula

Sa post na ito ng blog, nagpapatuloy tayo kung saan kami tumigil mula sa nakaraang post sa blog. Nais naming gawin ang mga sumusunod:

  1. I-configure ang mga literal sa gayon ay wala sa mga masyadong matigas na code na mumbo jumbos na magpatuloy. Nai-save namin ang aming mga pagsasaayos na mai-load mula sa MongoDb sa pamamagitan ng MLab kapag nagsimula ang proseso. Ang tanging hard-coded na halaga ay ang koneksyon string na ginamit upang kumonekta sa Mongo server.
  2. Generalization ng scheduler para sa pagpapatupad ng pipeline para sa maraming mga serbesa.
  3. Planuhin ang proseso upang tumakbo sa oras.
  4. Permanenteng mga gasgas sa MongoDb.

Susubukan namin ang paggamit ng Expecto at idagdag ang pag-log sa pamamagitan ng Logary sa pangatlong post sa blog sa seryeng ito.

Paghahanda

Nakatanggap ako ng isang mahusay na tip mula sa Atle Rudshaug tungkol sa paggamot ng kaso ng NoDifference. Dapat nating tratuhin ang kaso ng NoDifference bilang isang tagumpay. Kung walang pagkakaiba na natagpuan, huwag magpadala ng anumang teksto.

Mukhang ganito ang aming binagong module ng error:

Paghambingin ang pagpapaandar, na ngayon ay kinakalkula lamang ang pagkakaiba sa pagitan ng kasalukuyang at nakaraang simula.

Ang pagpapaandar ng notification ay dapat na ngayon matukoy kung ang isang teksto ay dapat na maipadala o hindi batay sa kardinalidad ng itinakdang pagkakaiba.

Nagdaragdag din kami ng isang bagong elemento ng uri ng string sa aming dataset na tinatawag na "Pangalan" upang matukoy ang direksyon ng generalization ng pipeline, na mai-highlight mamaya.

Ang aming file ng BeerInfo.fs na may na-update na uri ng record at static na mga elemento para sa Chiron ngayon ay ganito ang hitsura:

Pag-configure at pagbubuo

Tanggalin natin ang lahat ng mga hard-coded literals at gawing pangkalahatan ang pipeline sa isang listahan ng mga brewery sa halip na lamang sa Pagod na Mga Kamay. Sa ngayon nakagawa kami ng isang mahusay na trabaho sa paghihiwalay sa mga karaniwang sangkap. makakagawa tayo ng mas mahusay! Ilipat natin ang lahat ng mga pagsasaayos sa ulap at gawing pangkalahatan ang pipeline.

Konstruksyon

Gagamitin namin ang libreng tier ng MLab upang mapanatili ang lahat ng mga detalye ng pagsasaayos. Una lumikha kami ng isang database na tinatawag na "beerwayoriented programming" at idagdag ang koleksyon ng pagsasaayos. Ito ay dapat na isang medyo simpleng proseso. Ang interface ng MLab user ay hindi kapani-paniwala! Kung mayroon kang anumang mga problema, mangyaring huwag mag-atubiling makipag-ugnay sa akin.

Ang koleksyon ng pagsasaayos ay dapat munang maglaman ng isang dokumento kasama ang aming mga detalye sa Twilio. Maaari kaming magpasya sa ibang pagkakataon kung nais naming magdagdag ng maraming mga patlang dito.

Kapag napanatili, ang koleksyon ng pagsasaayos ay mukhang katulad nito:

{"_I" twilio nagpapadala ng numero ng telepono "}

Komunikasyon sa database

Susunod ay idinagdag namin ang mongocsharpdriver at MongoDB.FSharp sanggunian sa pamamagitan ng PACKAGE. Kung hindi ka sigurado kung paano ito gawin, mangyaring basahin ang nakaraang post, na naglalaman ng impormasyon sa paggamit ng PAKSIM, at suriin kung ang mga dependencies ay matagumpay na naitala.

Bago ang module ng error, lumikha kami ng isang bagong module na tinatawag na "Db" sa "Common.fs" file, na naglalaman ng lahat ng aming mga function na nauugnay sa database. Bilang karagdagan, ang lahat ng code para sa deserialization / serialization ng JSON file, na dati naming nagtrabaho sa Paghambing module, ay tinanggal.

Ang tanging literal na hard-coded ay ang string ng koneksyon. [Kung nais mong maging malikhain, maaari mong panatilihin ito sa isang file ng pagsasaayos gamit ang FSharp.Configurasi library.]

Lahat sa lahat, ang Db module ay ganito ang hitsura:

Ang higit pang mga detalye sa Mongo + F # CRUD ay matatagpuan sa aking naunang post sa blog, na matatagpuan mo dito. At ang binagong module ng alarma na may pagsasaayos ngayon ay ganito:

Pangkalahatan

Ang nag-iisang code na partikular sa paggawa ng serbesa ay nasa pares na partikular sa paggawa ng serbesa at sa pangunahing file ng pag-andar na naglalaman ng pipeline para sa serbesa. Kailangan nating baguhin ang module na Paghambingin upang lumikha ng Json file batay sa pangalan ng gumawa ng serbesa.

Ang binago na module ng BeerwayOrientedProgramming ngayon ay ganito:

At ang nabago na pagpapaandar ng paghahambing sa module na Paghambingin ngayon ay ganito:

Planner

Ang susunod na hakbang ay ang mag-set up ng isang scheduler upang patakbuhin ang mga pipeline ng serbesa sa isang timer. Para sa mga ito ay nai-download namin ang Quartz.NET para sa pagpaplano sa pamamagitan ng PACKAGE.

Matapos ang F # snippet na ito, madali naming mai-set up ang isang nakaplanong proseso para sa pagdaan sa lahat ng mga serbesa at pag-aralan ang mga detalye para sa bawat 2 segundo magpakailanman.

Hindi kami nakikipagtalo sa aming pagkuha ng beer, ngunit ginagawa ang proseso na ang beer ay nakakakuha ng isang bazooka sa antas ng kumpanya.

Patuloy na mga gasgas

Sa wakas, idagdag natin ang posibilidad na mai-save ang aming mga scrape sa parehong database ng MongoDb na may "beerway-oriented programming".

Para sa parehong kadahilanan na pangkalahatan namin ang aming proseso upang ang iba pang mga parser ng paggawa ng serbesa ay madaling maidagdag, bibigyan namin ng pangalan ang mga koleksyon ng database batay sa pangalan ng gumawa ng serbesa pagkatapos alisin ang serialization at deserialization ng JSON sa loob at labas ng isang file mayroon.

Una, alisin ang lahat ng mga dating bahagi ng JSON serialization at deserialization sa pamamagitan ng muling pagsusuri sa uri ng record ng BeerInfo at pagdaragdag ng BsonObjectId MongoDb ID pagkatapos alisin ang mga statikong elemento na batay sa Chiron.

Mukhang ganito ang bagong module ng BeerInfo:

Kung napansin mo, binago namin ang uri ng "Beers" mula sa isang listahan ng FSharp sa "Isa" hanggang "System.Generic.Collections" upang tumugma sa driver ng C # MongoDb kung saan nilikha ang F # One.

Aalisin namin ngayon ang sanggunian sa Chiron dahil hindi na namin ito kailangan. Upang gawin ito, buksan ang command palette [Cmd + Shift + P] at, pagkatapos mabuksan ang fsproj file, mag-navigate sa pag-alis ng pagtanggal ng PAKET tulad ng sumusunod:

Kapag tinanggal ang sanggunian sa Chiron, magdagdag kami ng ilang mga pamamaraan sa aming module ng Db na may kaugnayan sa paglikha ng mga bagong ID at makuha ang nakaraang scrap.

Kung ang isang pagbubukod ay nangyayari kapag sinusubukan upang makuha ang koleksyon na may pangalan ng paggawa ng serbesa, isang pagtatangka ang ginawa upang muling likhain ito gamit ang bloke.

Binawasan namin ang pagiging kumplikado ng pagpapanatili ng mga scrape mula sa Paghambingin ang module hanggang sa Db module sa pamamagitan ng pagkakahawak sa huling scrape. Sinuri namin kung ang huling scrape ay null [matapos na ma-convert ito sa isang bagay upang suriin ang pagkakasira habang ginagamit namin ang FirstOrDefault ()].

Ang aming na-update na TiredHandsScraper.scrape ngayon ay ganito ang hitsura:

Ang function ng getBeerNamesFromTiredHands ay ganito:

Bilang karagdagan, ang aming Paghambing module ay makabuluhang pinasimple:

Napakaganda na nagpapatuloy ang aming mga scrape, na maaaring kumpirmahin sa pamamagitan ng pagsuri sa aming mga dokumento sa koleksyon ng TiredHands:

Konklusyon

Tiyak na nakarating kami sa pamamagitan ng pagdaragdag, pagbubuo, pagplano at pagpapanatili ng pagsasaayos. Tulad ng nabanggit na, ang susunod at huling post sa seryeng ito ay naglalaman ng ilang mga pagsubok at pag-log upang mai-convert ito sa sandaling simpleng application sa isang ganap na binuo.

Palaging masaya akong natanggap ang iyong feedback!