برنامه نویسی محور آبجو در F # [2]

مقدمه

در این پست وبلاگ ، جایی را که از پست وبلاگ قبلی کنار گذاشته ایم ، ادامه می دهیم. ما می خواهیم موارد زیر را انجام دهیم:

  1. پیکربندی ها را طوری تنظیم کنید که هیچ یک از جهنده های کاملاً کد دار سخت ادامه پیدا نکنند. تنظیمات خود را که از MongoDb بارگیری می شود از طریق MLab هنگام شروع روند ذخیره می کنیم. تنها مقدار رمزگذاری شده سخت این رشته اتصال است که برای اتصال به سرور Mongo استفاده می شود.
  2. تعمیم برنامه زمانبندی اجرای خط لوله برای چندین کارخانه آبجو.
  3. برنامه ریزی کنید تا روند به موقع اجرا شود.
  4. خراش دائمی روی MongoDb.

ما استفاده از Expecto را تست خواهیم کرد و ورود به سیستم را از طریق Logary در پست سوم وبلاگ در این مجموعه اضافه خواهیم کرد.

مقدمات

من یک نکته عالی از Atle Rudshaug درباره درمان پرونده NoDifference دریافت کردم. ما باید با پرونده NoDifference به عنوان یک موفقیت رفتار کنیم. اگر تفاوتی پیدا نشد ، هیچ متنی را ارسال نکنید.

ماژول خطای اصلاح شده ما اینگونه است:

عملکرد را مقایسه کنید ، که اکنون تفاوت بین جریان فعلی و قبلی را به سادگی محاسبه می کند.

تابع اعلان اکنون باید تعیین کند که آیا یک متن باید بر اساس کارایی تفاوت تفاوت تنظیم شود یا خیر.

همچنین برای تعیین جهت عمومی سازی خط لوله ، یک عنصر نوع جدید "رشته" را به مجموعه داده های خود اضافه می کنیم که بعداً مشخص خواهد شد.

پرونده BeerInfo.fs ما با نوع رکورد به روز شده و عناصر ایستا برای Chiron اکنون به این شکل به نظر می رسد:

پیکربندی و تعمیم

بیایید خلاص شوید و از همه ادبیات دارای کد سخت استفاده کنید و خط لوله ای را به جای فقط Tired Hands ، به لیست کارخانه ها تعمیم دهید. تاکنون کار خوبی در تفکیک مؤلفه های مشترک انجام داده ایم. ما می توانیم بهتر انجام دهیم! بیایید تمام تنظیمات را به ابر منتقل کنیم و خط لوله را تعمیم دهیم.

ساخت و ساز

برای حفظ کلیه جزئیات پیکربندی ما از ردیف رایگان MLab استفاده خواهیم کرد. ابتدا یک دیتابیس به نام "برنامه نویسی beerwayoriented" ایجاد می کنیم و مجموعه تنظیمات را اضافه می کنیم. این باید یک فرایند نسبتاً ساده باشد. رابط کاربری MLab خارق العاده است! اگر مشکلی دارید لطفا با من تماس بگیرید.

مجموعه تنظیمات در ابتدا باید حاوی سندی با جزئیات Twilio باشد. اگر بخواهیم زمینه های بیشتری را در اینجا اضافه کنیم ، می توانیم بعدا تصمیم بگیریم.

پس از حفظ ، مجموعه پیکربندی چیزی شبیه به این است:

_ "_I will": o $ oid: 5976bcc1734d1d6202aa1556} ، "MyPhoneNumber": "شماره تلفن شما" ، "AccountSID": "حساب twilio شما sid" ، "AuthToken": "Twilio auth token" ، "SendingPhoneNumber": "شما twilio ارسال شماره تلفن "

ارتباط با بانک اطلاعاتی

سپس مرجع mongocsharpdriver و MongoDB.FSharp را از طریق PACKAGE اضافه می کنیم. اگر مطمئن نیستید که چگونه این کار را انجام دهید ، لطفا پست قبلی را که حاوی اطلاعاتی در مورد استفاده از PACKAGE است ، بخوانید و بررسی کنید که آیا وابستگی ها با موفقیت ارجاع شده اند یا خیر.

قبل از ماژول خطا ، ماژول جدیدی به نام "Db" را در پرونده "Common.fs" ایجاد می کنیم که شامل تمام عملکردهای مربوط به بانک اطلاعاتی ما است. علاوه بر این ، کلیه کد ها برای deserialization / serialization پرونده JSON که قبلاً در ماژول مقایسه کار کرده بودیم ، حذف می شود.

تنها اصطلاحی که سخت کده است رشته اتصال است. [اگر می خواهید خلاق باشید ، می توانید با استفاده از کتابخانه FSharp.Configuration ، آن را در یک پرونده پیکربندی کنید.]

در کل ، ماژول Db به این صورت است:

جزئیات بیشتر در مورد Mongo + F # CRUD را می توان در پست وبلاگ قبلی من یافت ، که می توانید در اینجا بیابید. و ماژول هشدار اصلاح شده با پیکربندی اینگونه به نظر می رسد:

تعمیم

تنها کد مخصوص کارخانه آبجوسازی در پارسر مخصوص آبجو و در پرونده اصلی عملکرد موجود است که شامل خط لوله برای آبجو است. برای ایجاد پرونده Json براساس نام آبجکت باید ماژول مقایسه را تغییر دهیم.

ماژول تغییر یافته BeerwayOrientedProgramming اکنون به شرح زیر است:

و عملکرد مقایسه شده تغییر یافته در ماژول مقایسه اکنون چنین است:

برنامه ریز

قدم بعدی تنظیم برنامه زمانبندی برای اجرای خطوط لوله آبجوسازی بر روی تایمر است. برای این کار Quartz.NET را برای برنامه ریزی از طریق PACKAGE بارگیری می کنیم.

پس از این قطعه F # ، می توانیم به راحتی یک روند برنامه ریزی شده را برای طی کردن تمام کارخانه ها تنظیم کنیم و برای هر 2 ثانیه برای همیشه جزئیات را تجزیه و تحلیل کنیم.

ما با تهیه آبجو خود متناقض نیستیم اما فرایندی را انجام می دهیم که آبجو در سطح شرکت بازوکا شود.

خش های مداوم

سرانجام ، بیایید امکان ذخیره اسکراب های خود را در همان پایگاه داده MongoDb با "برنامه نویسی جهت دهی به آبجو" اضافه کنیم.

به همین دلیلی که فرآیند خود را تعمیم می دهیم تا بتوانید پارسهای آبجوسازی دیگری را نیز به راحتی اضافه کنید ، پس از حذف سریال سازی JSON و deserialization در داخل و خارج از پرونده ، مجموعه های بانک اطلاعاتی را بر اساس نام آبجکت نامگذاری می کنیم. داشتن

اول ، همه قطعات قدیمی سریال سازی و deserialization JSON با بررسی مجدد نوع رکورد BeerInfo و اضافه کردن شناسه BsonObjectId MongoDb پس از حذف عناصر استاتیک مبتنی بر Chiron حذف می شوند.

ماژول جدید BeerInfo به نظر می رسد:

اگر توجه کردید ، ما نوع "آبجو" را از لیست FSharp به "یک" به "System.Generic.Collections" تغییر دادیم تا با درایور C # MongoDb که در آن F # One ایجاد شده است مطابقت داشته باشد.

اکنون ما مرجع Chiron را حذف خواهیم کرد زیرا دیگر نیازی به آن نداریم. برای این کار ، پالت فرمان [Cmd + Shift + P] را باز کنید و پس از باز کردن پرونده fsproj ، به مرجع حذف PAKET به شرح زیر بروید:

پس از حذف مرجع Chiron ، ما چند روش به ماژول Db اضافه خواهیم کرد که مربوط به ایجاد شناسه جدید و دریافت ضایعات قبلی است.

اگر استثنائی در هنگام بدست آوردن مجموعه با نام آبجوسازی اتفاق بیفتد ، تلاش می شود تا آن را در بلوک مجدداً بسازید.

ما با گرفتن آخرین ضایعات ، پیچیدگی نگه داشتن ضایعات را از ماژول مقایسه به ماژول Db کاهش داده ایم. ما بررسی می کنیم که آیا آخرین ضایعات تهی است [پس از تبدیل آن به یک شیء ، برای بررسی قابلیت تهی بودن همانطور که از FirstOrDefault استفاده می کنیم ()].

عملکرد به روز شده TiredHandsScraper.scrape ما اینگونه به نظر می رسد:

عملکرد getBeerNamesFromTiredHands مانند این است:

علاوه بر این ، ماژول مقایسه ما به طور قابل توجهی ساده شده است:

این عالی است که ضایعات ما همچنان ادامه دارد ، که می تواند با بررسی اسناد و مدارک ما در مجموعه TiredHands تأیید شود:

نتیجه گیری

ما قطعاً با افزودن ، عمومی سازی ، برنامه ریزی و حفظ پیکربندی مسیری طولانی را طی کرده ایم. همانطور که قبلاً نیز گفته شد ، پست بعدی و آخر در این مجموعه شامل تست ها و ورود به سیستم برای تبدیل این برنامه یک بار ساده به یک برنامه کاملاً توسعه یافته است.

من همیشه از بازخورد شما خوشحال هستم!