Ориентирано към Beerway програмиране във F # [2]

Въведение

В този блог продължаваме там, където сме останали от предишния блогпост. Ние се стремим да направим следното:

  1. Конфигурирането на литералите, така че никоя от прекомерните твърдо кодирани мамбо джъмбо не продължава. Ще запазваме конфигурациите си, които ще бъдат заредени при стартиране на процеса от MongoDb чрез MLab. Единствената твърдо кодирана стойност ще бъде стойността на връзката за свързване към Mongo сървъра.
  2. Обобщаване на планировчика за пускане на тръбопровода за множество пивоварни.
  3. Планиране на процеса да протича навреме.
  4. Персистиращи драскотини чрез MongoDb.

Ще преминем през тестване с помощта на Expecto и ще добавим регистрация чрез Logary в третия блог от тази серия.

Предварителен

Получих страхотен указател за справяне със случая NoDifference от Atle Rudshaug; трябва да третираме случая NoDifference като успех, т.е. ако не се установи разлика, не изпращайте текст.

Нашият променен модул за грешки изглежда така:

Сравнете функцията, която сега просто променя разликата между текущата и предишната остъргване.

Функцията за предупреждение вече има възможността да разбере дали да изпрати или не текст, въз основа на кардиналността на зададената разлика.

Освен това ще добавим нов член от тип низ към нашия запис, наречен „Име“, за да преминем към посока за обобщаване на тръбопровода, която ще бъде подчертана по-късно.

Нашите BeerInfo.fs, с актуализирания тип запис и статичните членове, свързани с Chiron, изглеждат така:

Конфигурация и обобщаване

Нека се отървем от всички твърдо кодирани литерали и да обобщим тръбопровода над списък от пивоварни, а не само от уморените ръце. Досега свършихме добра работа, отделяйки общите компоненти; можем да се справим по-добре! Нека преместим всички конфигурации в облака и да генерализираме pipleline.

Конфигурация

Ще използваме безплатния слой на MLab, за да запазим всички детайли на конфигурацията. Започваме със създаване на база данни, наречена „beerwayorientedprogramming“ и добавяне на колекцията от конфигурации; това трябва да е доста прав процес. Потребителският интерфейс на MLab е страхотен! Чувствайте се свободни да се свържете с мен, ако имате някакви проблеми.

Конфигурационната колекция засега трябва да съдържа документ с нашите подробности за Twilio. Можем да вземем решение по-късно дали искаме да добавим други полета тук.

Веднъж запазената конфигурационна колекция ще бъде подобна на следното:

{
    "_документ за самоличност": {
        "$ oid": "5976bcc1734d1d6202aa1556"
    }
    "MyPhoneNumber": "вашият телефонен номер",
    "AccountSID": "вашия акаунт за twilio",
    "AuthToken": "вашето twilio auth token",
    "SendingPhoneNumber": "вашият номер за изпращане на twilio"
}

Комуникация с базата данни

След това ще добавим препратката mongocsharpdriver и MongoDB.FSharp чрез PAKET. Ако не сте сигурни как да направите това, моля, вижте предишната публикация, която съдържа информация за това как да използвате PAKET и проверете два пъти дали зависимостите са били успешно препратени.

Ще създадем нов модул, наречен Db, във файла Common.fs преди модула Грешка, който ще съдържа цялата ни функция, свързана с базата данни. Освен това ще извадим целия код, за да десериализираме / сериализираме JSON файла, по който преди това работихме в модула Сравняване.

Единственият буквален код, който трябва да бъде твърдо кодиран, е връзката на връзката [ако искате да бъдете креативни, можете да запазите това в конфигурационен файл с помощта на библиотеката FSharp.Configuration].

Като цяло Db модулът изглежда така:

Повече подробности за Mongo + F # CRUD операции можете да намерите в предишния ми блогпост, който можете да намерите тук. И промененият модул за предупреждение с конфигурация сега изглежда така:

обобщение

Единственият специфичен код за пивоварната ще живее в специфичния анализатор на пивоварната и файла, който съдържа основната функция, която ще съдържа тръбопровода за пивоварната. Ще трябва да променим модула за сравнение, за да създадем файла Json въз основа на името на пивоварната.

Промененият модул BeerwayOrientedProgramming сега изглежда така:

И променената функция за сравнение в модула за сравнение сега изглежда така:

Scheduler

Следващата стъпка е да настроите планировчик, който да пуска breweryPipelines на таймер. За това ще изтеглим Quartz.NET за планирането чрез PAKET.

Следвайки този F # Snippet, ние можем лесно да настроим планиран процес за преминаване през всички пивоварни и да анализираме детайлите на всеки 2 секунди завинаги.

Ние не се занимаваме с нашето придобиване на бира, правим процеса на някаква корпоративна бира, получавайки базука.

Устойчиви ожулвания

И накрая, нека добавим възможността да поддържаме нашите записки към същата база данни на MongoDb за „биево ориентирано програмиране“.

Със същия дух на обобщаване на нашия процес за лесно добавяне на други анализатори на пивоварна, ще именуваме колекциите на базата данни на базата на името на пивоварната, след като извадим JSON сериализация и десериализация към и от файл.

Ще започнем, като извадим всички стари компоненти на сериализацията и десериализацията на JSON, като прегледаме нашия запис на BeerInfo и добавим MongoDb Id, който е тип BsonObjectId, след като премахнем нашите статични членове, базирани на Хирон.

Новият модул BeerInfo изглежда така:

Ако забележите, променихме типа „Beers“ от списък на FSharp в такъв на System.Generic.Collections един, за да се съобразим с драйвера на C # MongoDb, който F # one е построен отгоре.

Сега ще премахнем препратката към Chiron, тъй като вече не ни е нужна. Това става чрез отваряне на командната палета [Cmd + Shift + P] и преминаване към препратката на PAKET за премахване по следния начин след отваряне на файла fsproj:

След като препратката към Chiron бъде премахната, ще добавим няколко метода към нашия Db модул, подходящ за създаване на нови идентификационни номера, както и за получаване на предишния изтриване.

Ако има изключение, докато се опитваме да получим колекцията по името на пивоварната, ще се опитаме да я пресъздадем в блок с.

Премахнахме сложността на устойчивото изтриване от модула Сравнение с Db, където грабваме последния скрап. Проверяваме дали последната изтривка е нулева [след като я хвърлим в обект, за да проверим за нищожност, тъй като използваме FirstOrDefault ()].

Нашата актуализирана функция на TiredHandsScraper.scrape ще изглежда така:

с функцията getBeerNamesFromTiredHands изглежда като:

Освен това модулът ни за сравнение ще бъде значително опростен:

Страхотно е да оставим нашите записки, които да могат да бъдат потвърдени чрез проверка на документите ни в колекцията на TiredHands:

заключение

Определено сме стигнали далеч, като добавим конфигурация, генерализиране, планиране и постоянство. Както бе споменато по-горе, следващата и последната публикация от тази серия ще съдържа някои тестове и регистриране, за да се засили напълно това веднъж просто приложение в напълно развито такова.

Както винаги, аз оценявам отзивите ви!