Scope ve interface’ler
Singleton, Scoped ve Transient seçimlerini handshake, mesaj ve lifecycle hook’larının gerçek ömürleriyle eşleştirin.
DI lifetime bir servisin ne zaman oluşturulduğunu ve hangi owner tarafından temizlendiğini belirler. Arc<T> kullanmak lifetime seçimi değildir; yalnızca referansı paylaşır.
Servis yaşam süreleri#
| Lifetime | Paylaşım | Tipik kullanım |
|---|---|---|
| Singleton | Container boyunca aynı instance | Pool, immutable politika, paylaşılan istemci |
| Scoped | Aynı aktif scope'ta aynı instance | Mesaj transaction'ı, iş birimi |
| Transient | Her resolve için yeni instance | Kısa ömürlü yardımcı servis |
Bir Scoped servisin Arc klonunu connection local'e koymak kaynağın kullanım hakkını uzatmaz. Scope kapanınca dispose çalışabilir. Paylaşılması gereken bağlantı verisini owned DTO olarak saklayın.
WebSocket scope’ları#
| Sınır | Scope davranışı |
|---|---|
| Handshake middleware / identity | Bu adımlar varsa geçici handshake scope'u |
| Connection middleware | Bağlantı ömründe kalıcı DI scope'u sağlamaz |
connected |
Kendi lifecycle invocation scope'u |
| Her seçilmiş mesaj | Middleware, guard, extractor ve action'ın ortak scope'u |
disconnected |
Yeni cleanup invocation scope'u |
Handshake scope'u HTTP 101 öncesinde temizlenir. Kimlik sonucuna taşınan owned veriler kalır; Scoped verifier instance'ı kalmaz. Connected ile disconnected aynı scope'u paylaşmaz. Kuyrukta bekleyen mesaj henüz bir DI scope'u veya action task'ı oluşturmaz.
Interface kaydı#
Concrete servis, bir trait-object yoluyla da yayımlanabilir. Aşağıdaki parça DI bağımlılıklarına ek bir bağımlılık istemez:
use std::sync::Arc;
use lilyrs::websocket::Injectable;
use lilyrs::websocket::ServiceTrait;
trait GreetingSource: Send + Sync {
fn greeting(&self) -> &'static str;
}
#[derive(Injectable)]
#[service(interface = dyn GreetingSource, lifetime = "Singleton")]
struct TurkishGreeting;
impl GreetingSource for TurkishGreeting {
fn greeting(&self) -> &'static str { "Merhaba" }
}
impl ServiceTrait for TurkishGreeting {}
#[derive(Injectable)]
#[service(lifetime = "Scoped")]
struct WelcomeService {
#[inject]
source: Arc<dyn GreetingSource>,
}
impl ServiceTrait for WelcomeService {}Action parametresinde Service<dyn GreetingSource> da kullanılabilir. Aynı interface için iki aktif implementation build hatasıdır; seçim gerekiyorsa DI kaydını uygulamanın başlangıç modelinde tekleştirin. #[inject(as = ...)] gibi bir alan sözleşmesi kullanmayın.
Lifetime uyumluluğu#
Singleton bir controller veya middleware'e, mesajın Scoped transaction'ını constructor'da bağlamak yerine aktif exchange üzerinden resolve edin. Concrete ve interface resolve aynı registration ve lifetime modelini izler. Transient servis iki kez çözülürse aynı allocation beklenmez.
Bu ayrım özellikle PostgreSQL transaction, authentication verifier ve message middleware örneklerinde belirleyicidir.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.