lilydocs
HTTP APIWebSocketConsumer
Temeller2 dk okuma

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:

Interface servisi
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.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod