Programació orientada a Beerway a F # [2]

Introducció

En aquesta entrada del bloc, continuem on ens vam deixar fora de la publicació anterior del bloc. Volem fer el següent:

  1. Configureu els literals de manera que no continuï cap dels salts de mumbo massa codificats. Desem les configuracions que es carreguen de MongoDb mitjançant MLab quan s’inicia el procés. L’únic valor de codi dur és el de la cadena de connexió que s’utilitza per connectar-se al servidor Mongo.
  2. Generalització del planificador per a l'execució del gasoducte per a diverses cerveseries.
  3. Planifiqueu el procés a temps.
  4. Esgarrapades permanents sobre MongoDb.

Provarem l'ús d'Expecto i afegirem registre mitjançant Logary a la tercera publicació del bloc d'aquesta sèrie.

Preparatius

Vaig rebre un bon consell d’Atle Rudshaug sobre el tractament del cas NoDifference. Hauríem de tractar el cas NoDifference com un èxit. Si no es troba cap diferència, no envieu cap text.

El nostre mòdul d’error modificat ara s’assembla a això:

Compareu la funció, que ara simplement calcula la diferència entre la ratllada actual i la anterior.

Ara la funció de notificació ha de determinar si un text s’ha d’enviar o no en funció de la cardinalitat de la diferència de conjunt.

També afegim un nou element de tipus "Cadena" al nostre conjunt de dades anomenat "Nom" per determinar la direcció de la generalització del conducte, que es ressaltarà més endavant.

El nostre fitxer BeerInfo.fs amb el tipus de registre actualitzat i els elements estàtics de Chiron s’assembla així:

Configuració i generalització

Alliberem-nos de tots els literals amb codis durs i generalitzem el pipeline a una llista de cerveseres, en lloc només de les mans cansades. Fins ara hem fet un bon treball de separació dels components comuns. podem fer-ho millor! Movem totes les configuracions al núvol i generalitzem el pipeline.

Construcció

Utilitzarem el nivell gratuït de MLab per mantenir tots els detalls de la configuració. Primer creem una base de dades anomenada "programació per a la cervesa" i afegim la col·lecció de configuració. Aquest ha de ser un procés bastant simple. La interfície d'usuari de MLab és fantàstica. Si teniu cap problema, no dubteu en contactar-me.

La col·lecció de configuració hauria de contenir inicialment un document amb els nostres detalls de Twilio. Podrem decidir més endavant si volem afegir més camps aquí.

Un cop mantinguda, la col·lecció de configuració sembla una cosa així:

{"_I faria": {$ oid: 5976bcc1734d1d6202aa1556}, "MyPhoneNumber": "El vostre número de telèfon", "AccountSID": "El vostre compte twilio sid", "AuthToken": "El vostre toilio de Twilio Auth", "SendingPhoneNumber": "El teu número de telèfon enviant Twilio "}

Comunicació amb la base de dades

A continuació, afegim la referència mongocsharpdriver i MongoDB.FSharp mitjançant PACKAGE. Si no esteu segurs de com fer-ho, llegiu la publicació anterior, que conté informació sobre com utilitzar PACKAGE i comproveu si les dependències s’han fet referència amb èxit.

Abans del mòdul d’error, hem creat un nou mòdul anomenat "Db" al fitxer "Common.fs", que conté totes les funcions relacionades amb la nostra base de dades. A més, s’elimina tot el codi per a la deserialització / serialització del fitxer JSON, que ja havíem treballat anteriorment al mòdul Compare.

L’únic literal que té codis durs és el de la cadena de connexió. [Si voleu ser creatius, podeu conservar-lo en un fitxer de configuració mitjançant la biblioteca FSharp.Configuration.]

Per tot plegat, el mòdul Db sembla:

Podeu trobar més detalls sobre Mongo + F # CRUD a la meva entrada anterior al bloc, que podeu trobar aquí. I el mòdul d'alarma modificat amb la configuració sembla ara:

Generalització

L'únic codi específic de la cerveseria es troba a l'analitzador específic de la cerveseria i al fitxer de funció principal que conté la canalització per a la cerveseria. Hem de canviar el mòdul Compare per crear el fitxer Json en funció del nom del cerveser.

El mòdul canviat de BeerwayOrientedProgramming ara es veu així:

I la funció canviada de comparació al mòdul de comparació ara s’assembla a aquesta:

Planificador

El següent pas és configurar un planificador per executar les canonades de cerveseria en un temporitzador. Per a això descarreguem Quartz.NET per a la planificació mitjançant PACKAGE.

Després d’aquest fragment F #, podem configurar fàcilment un procés planificat per passar per totes les cerveseries i analitzar-ne els detalls cada 2 segons per sempre.

No fem un joc amb la compra de cervesa, sinó que fem el procés perquè la cervesa obtingui una bazooka a nivell d’empresa.

Esgarrapades persistents

Finalment, afegim la possibilitat de guardar els nostres rascades a la mateixa base de dades MongoDb amb "programació orientada a la cervesa".

Per la mateixa raó, generalitzem el nostre procés perquè es puguin afegir fàcilment altres analitzadors de cerveseria, anomenarem les col·leccions de la base de dades en funció del nom del cerveser després d’eliminar la serialització i la deserialització JSON dins i fora d’un fitxer tenir.

Primer, tots els components antics de serialització i deserialització de JSON s'eliminen revisant el tipus de registre BeerInfo i afegint l'ID BongoObjectId MongoDb després d'eliminar els elements estàtics basats en Chiron.

El nou mòdul BeerInfo s’assembla a això:

Si us adoneu, hem canviat el tipus Beers d'una llista de FSharp a One a System.Generic.Collections per coincidir amb el controlador C # MongoDb en què es va crear el F # One.

Ara suprimirem la referència a Chiron ja que ja no la necessitem. Per fer-ho, obriu la paleta d'ordres [Cmd + Shift + P] i, després d'obrir el fitxer fsproj, navegueu fins a la referència d'eliminació de PAKET de la següent manera:

Un cop s’hagi eliminat la referència a Chiron, afegirem al nostre mòdul Db alguns mètodes rellevants per crear nous ID i obtenir la ferralla anterior.

Si es produeix una excepció quan s'intenta obtenir la col·lecció amb el nom de la cerveseria, es fa un intent de recrear-la al bloc with.

Hem reduït la complexitat de mantenir els rascades del mòdul Compare al mòdul Db agafant l'últim rascat. Comprovem si l'últim rascat és nul [després de convertir-lo en un objecte per comprovar la nul·litat quan utilitzem FirstOrDefault ()].

La nostra funció actualitzada TiredHandsScraper.scrape ara sembla:

La funció getBeerNamesFromTiredHands s’assembla a aquesta:

A més, el nostre mòdul de comparació està simplificat de manera significativa:

És fantàstic que els nostres rascades persisteixin, que es poden confirmar consultant els nostres documents de la col·lecció TiredHands:

Conclusió

Definitivament, hem recorregut un llarg camí afegint, generalitzant, planificant i mantenint la configuració. Com ja hem comentat, la propera i última publicació d'aquesta sèrie conté algunes proves i registre per convertir aquesta vegada una aplicació senzilla en una totalment desenvolupada.

Sempre estic encantat de rebre els vostres comentaris.