من اغلب نیاز به استخراج یک روش خاص در یک سرویس کاملاً جدید دارم. این سرویس جدید اکنون تنها هدف از این روش را دارد.

این بیشتر هنگام کار با کدهایی است که با زیرساخت ها (لاگ، فایل ها، شبکه، APIها) ارتباط برقرار می کنند. این کد عمدتاً ثابت است و نیازی به اجرای کامل سرویس جدید ندارد. اما، با این وجود، باید یک کلاس جدید ایجاد شود تا این قابلیت را داشته باشد.

من شروع کردم به جستجوی مختصرترین شکل نوشتن آن عملکرد، بدون نیاز به معرفی کلاس پیاده‌سازی سرویس جدید، یک رابط برای یک تابع، نوعی صحبت…

نتیجه این کار در یک کتابخانه کوچک به نام FuncR بسته بندی شده است، به من اجازه دهید توضیح بیشتری بدهم…

FuncR یک کتابخانه استاندارد دات نت کوچک است که به شما امکان می دهد توابع را در برابر رابط ها در C# ثبت کنید.

به طور خلاصه، به شما این امکان را می دهد که از این مسیر بروید:

حالت اولبه چیزی شبیه به این:

FuncR از یک DispatchProxy برای تولید یک کلاس پراکسی استفاده می کند که رابط را در زمان اجرا نمونه سازی می کند و توابع ثبت شده را به متدهای رابط متصل می کند.

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

بیایید همه اینها را در یک برنامه کنسول دات نت قرار دهیم!

یک برنامه کنسول جدید ایجاد کنید (در NET Core 2، 3 یا .NET 5):

mkdir Your.First.Function
cd Your.First.Function
dotnet new console

پکیج FuncR  را اضافه نمایید:

dotnet add package FuncR

کد پیاده سازی را به صورت زیر بنویسید:

using System;
using FuncR;
using Microsoft.Extensions.DependencyInjection;

namespace Your.First.Function
{
    // We don't need no, implementation
    public interface IFooService
    {
        string Foo(int numberOfFoos);
    }

    class Program
    {
        static void Main(string[] args)
        {
            var services = new ServiceCollection();

            services.AddScopedFunction<IFooService>
                (nameof(IFooService.Foo))
                // string Foo(int numberOfFoos)
                .Runs<int, string>(numberOfFoos =>
                {
                    if(numberOfFoos >= 5)
                        return "Too many foos!";

                    return $"This many foos: '{numberOfFoos}'";
                });

            var fooService =
                services.BuildServiceProvider().GetRequiredService<IFooService>();

            // Prints: "This many foos: '3'"
            Console.WriteLine(fooService.Foo(3));
            // Prints: "Too many foos!"
            Console.WriteLine(fooService.Foo(5));
        }
    }
}

کد را اجرا کنید:

dotnet run

خروجی به صورت زیر خواهد بود:

بررسی جزییات کد نوشته شده:

خط 8 : تعریف و آماده سازی برای رابط سرویس

خط 19 پروکسی IFooService را ثبت می کند

خط 20 نشانگر تابع را برای نام "Foo" در پروکسی ثبت می کند

خطوط 22-28 اجرای واقعی تابع را برای پراکسی به شکل <TParameter1Type، TReturnType>، مانند هر تابع C# ثبت می کند.

خط 30 سرویس ثبت شده ما را از ظرف تزریق وابستگی حل می کند.

خطوط 34 و 36 با پروکسی تماس می گیرند، که تابع ثبت شده را جستجو می کند و آن را فراخوانی می کند.

مستندات:

FuncR با اسناد گسترده و پروژه های نمونه همراه است تا به شما در شروع کار کمک کند!

این شامل تفکیک سرویس از طریق تزریق وابستگی، توابع ناهمگام و توابع تو در تو می شود.

 

منبع: Medium.com