Ore: Advanced Dependency Injection Package for Go

سنگ معدن: یک بسته تزریق وابستگی پیشرفته برای Go
وب سایت اسناد سنگ معدن
مخزن GitHub
Go به دلیل سادگی و کارایی بالا معروف است، اما زمانی که صحبت از مدیریت وابستگی ها می شود، توسعه دهندگان اغلب با چالش هایی مواجه می شوند. اگرچه Go مانند برخی از زبانهای دیگر چارچوب DI داخلی ندارد، کتابخانههای شخص ثالث زیادی وجود دارند که میتوانند کمک کنند. سنگ معدن یکی از این بسته ها است که راه حلی سبک و کارآمد برای تزریق وابستگی (DI) در برنامه های Go ارائه می دهد.
سنگ معدن به گونه ای طراحی شده است که DI را آسان تر و کارآمدتر کند، بدون اینکه سربار عملکرد قابل توجهی ایجاد کند. برخلاف بسیاری از کتابخانه های DI دیگر، Ore از اهرم استفاده می کند برو ژنریک به جای بازتاب یا تولید کد، که تضمین می کند برنامه شما سریع و ایمن باقی می ماند. این امر Ore را به یک انتخاب بسیار محکم برای توسعه دهندگانی تبدیل می کند که به دنبال یک راه حل DI کارآمد و با استفاده آسان هستند.
در این مقاله، ویژگیهای اصلی Ore و اینکه چگونه میتوانند به شما در مدیریت وابستگیهای خود در Go کمک کنند، خواهیم پرداخت. ما همچنین چند نمونه کد اساسی را نشان خواهیم داد تا نشان دهیم چگونه می توان از Ore در برنامه های کاربردی دنیای واقعی استفاده کرد.
ویژگی های کلیدی سنگ معدن
1. تزریق وابستگی مبتنی بر ژنریک
اهرم های سنگ معدن برو ژنریک برای ثبت و رفع وابستگی ها این انتخاب طراحی از سربار عملکرد معمولاً مرتبط با بازتاب و تولید کد جلوگیری می کند. با استفاده از ژنریک، Ore تضمین می کند که وضوح وابستگی از نظر نوع ایمن و کارآمد است، بدون نیاز به بازرسی زمان اجرا از انواع.
این رویکرد Ore را به یک راهحل DI بسیار کارآمد تبدیل میکند، زیرا از مشکلات بازتاب و تولید کد، که در بسیاری از چارچوبهای DI دیگر رایج است، جلوگیری میکند.
2. ثبت نام ساده و قابل انعطاف
Ore راههای متعددی را برای ثبت خدمات ارائه میکند که به شما بر اساس طول عمر سرویس انعطافپذیری میدهد (به عنوان مثال، Singleton، Scoped، Transient). چه به یک نمونه واحد نیاز داشته باشید، چه به یک نمونه محدوده برای یک زمینه خاص، یا یک نمونه گذرا که هر بار که درخواست می شود ایجاد می شود، Ore شما را تحت پوشش قرار می دهد.
3. خدمات کلید خورده
Ore به شما امکان می دهد چندین پیاده سازی از یک رابط را با استفاده از یک رابط ثبت و حل کنید خدمات کلیدی. این ویژگی زمانی مفید است که نیاز به مدیریت چندین نسخه از یک سرویس دارید یا بر اساس شرایطی به رفتارهای متفاوتی نیاز دارید.
برای مثال، میتوانید چندین پیادهسازی از یک سرویس برای محیطهای مختلف (مثلاً آزمایش، تولید) یا برای پیکربندیهای مختلف (مثلاً بر اساس نقشهای کاربر) داشته باشید.
4. خدمات نگهدارنده مکان
سنگ معدن نیز پشتیبانی می کند خدمات نگهدارنده مکان، که به شما امکان می دهد خدماتی را با وابستگی های حل نشده ثبت کنید که می توانند در زمان اجرا پر شوند. این ویژگی زمانی مفید است که مقادیر یا خدمات خاصی در زمان ثبت نام در دسترس نباشد، اما بعداً زمانی که در دسترس قرار گرفت میتوان آن را تزریق کرد.
به عنوان مثال، می توانید سرویسی را ثبت کنید که به مقادیر پیکربندی نیاز دارد، و سپس پیکربندی واقعی را به صورت پویا بر اساس زمینه (به عنوان مثال، نقش کاربر یا محیط) ارائه دهید.
5. اعتبار سنجی
سنگ معدن شامل ساخته شده است اعتبار ثبت نام برای گرفتن مسائل رایج مانند:
- وابستگی های از دست رفته: اطمینان حاصل می کند که تمام خدمات مورد نیاز ثبت شده است.
- وابستگی های دایره ای: زنجیره های وابستگی دایره ای را تشخیص داده و از آن جلوگیری می کند.
- ناهماهنگی مادام العمر: تضمین می کند که خدمات با طول عمر بیشتر به خدمات با طول عمر کمتر بستگی ندارد.
هنگامی که خدمات را با استفاده از سرویس ها حل می کنید، این اعتبار سنجی به طور خودکار انجام می شود ore.Get
یا ore.GetList
، اما می توانید اعتبار سنجی را به صورت دستی نیز با استفاده از آن فعال کنید ore.Validate()
. این تضمین می کند که نمودار وابستگی شما صحیح است و از خطاهای زمان اجرا به دلیل پیکربندی نادرست جلوگیری می کند.
علاوه بر این، میتوانید اعتبارسنجی را به دلایل عملکرد غیرفعال کنید یا ظرف را مهر و موم کنید تا پس از ثبت همه سرویسها از تغییرات بیشتر جلوگیری کنید.
6. عملکرد بالا
عملکرد یک نکته کلیدی در Ore است. با اجتناب از بازتاب و تولید کد، Ore سریع باقی می ماند، حتی در برنامه های بزرگ با نمودارهای وابستگی پیچیده. نتایج محک سنگ معدن کارایی آن را نشان میدهد و برخی از عملیات تنها در چند نانوثانیه تکمیل میشوند. این امر Ore را به گزینهای عالی برای برنامههای Go با کارایی بالا تبدیل میکند که نیاز به DI کارآمد بدون سربار دارند.
7. کانتینرهای مدولار و اسکوپی
سنگ معدن پشتیبانی برای ظروف مدولار، به شما این امکان را می دهد که کانتینرهای جداگانه ای برای بخش های مختلف برنامه خود تعریف کنید. این به ویژه برای برنامه های ماژولار مفید است، جایی که اجزا یا ماژول های مختلف وابستگی های مشخصی دارند. میتوانید کانتینرهای محدودهدار را برای موارد استفاده مختلف تعریف کنید و مدیریت وابستگی خود را سازماندهیتر و نگهداری آسانتر کنید.
نمونه های کد
برای درک بهتر نحوه عملکرد Ore، اجازه دهید به چند مثال ساده با استفاده از ظرف پیشفرض Ore نگاهی بیندازیم.
مثال 1: ثبت خدمات پایه و حل و فصل
package main
import (
"context"
"fmt"
"github.com/firasdarwish/ore"
)
// Define an interface
type Greeter interface {
Greet() string
}
// Define a service implementation
type FriendlyGreeter struct{}
func (g *FriendlyGreeter) Greet() string {
return "Hello, world!"
}
func main() {
// Register the service with the default Ore container
ore.RegisterFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {
return &FriendlyGreeter{}, ctx
})
// Resolve the service from the default Ore container
greeter, _ := ore.Get[Greeter](context.Background())
fmt.Println(greeter.Greet()) // Output: Hello, world!
}
این مثال ثبت اولیه یک سرویس را نشان می دهد. در اینجا، a را تعریف می کنیم Greeter
رابط با a FriendlyGreeter
پیاده سازی، آن را به صورت singleton ثبت کنید و سپس با استفاده از کانتینر پیش فرض Ore آن را حل کنید.
مثال 2: خدمات کلیدی برای چند پیاده سازی
package main
import (
"context"
"fmt"
"github.com/firasdarwish/ore"
)
// Define an interface
type Greeter interface {
Greet() string
}
// Define multiple implementations
type FriendlyGreeter struct{}
func (g *FriendlyGreeter) Greet() string {
return "Hello, friend!"
}
type FormalGreeter struct{}
func (g *FormalGreeter) Greet() string {
return "Good day, Sir/Madam."
}
func main() {
// Register multiple implementations with keys
ore.RegisterKeyedFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {
return &FriendlyGreeter{}, ctx
}, "friendly")
ore.RegisterKeyedFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {
return &FormalGreeter{}, ctx
}, "formal")
// Resolve a specific implementation based on the key
greeter, _ := ore.GetKeyed[Greeter](context.Background(), "friendly")
fmt.Println(greeter.Greet()) // Output: Hello, friend!
greeter, _ = ore.GetKeyed[Greeter](context.Background(), "formal")
fmt.Println(greeter.Greet()) // Output: Good day, Sir/Madam.
}
در این مثال، ما دو پیاده سازی را ثبت می کنیم Greeter
رابط با استفاده از کلیدها ("friendly"
و "formal"
) و آنها را بر اساس کلید مورد نیاز حل کنید. این انعطاف پذیری به شما امکان می دهد پیاده سازی های مختلف را به راحتی مدیریت کنید.
نتیجه گیری
Ore یک راه حل تزریق وابستگی تمیز، ساده و کارآمد برای Go ارائه می دهد. با استفاده از آن برو ژنریک، سنگ معدن تحویل می دهد سریع و نوع ایمن وضوح وابستگی بدون سربار عملکرد بازتاب. این انعطاف پذیر، آسان برای استفاده، و شامل ویژگی های مانند خدمات کلیدی، خدمات نگهدارنده مکان، و اعتبار سنجی برای اطمینان از اینکه برنامه شما قوی باقی می ماند.
وب سایت اسناد سنگ معدن
مخزن GitHub