Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 24701|Yanıt: 1

[Kaynak] Autofac, kapsam ve ömrü kontrol eder

[Bağlantıyı kopyala]
2020-9-19 tarihinde yayınlandı 12:51:52 | | | |
Autofac kontrol kapsamı ve yaşam döngüsü hakkında öğrenmek için iyi bir makale; yaşam döngüsü kapsamı, uygulamanızdaki bir iş birimine eşdeğerdir, bir iş birimi yaşam döngüsü kapsamını baştan başlatır ve ardından bu iş birimini gerektiren hizmetler yaşam döngüsü kapsamından ayrıştırılır.

Ömür Boyu Dürbünler

Lifetme Dürbünleri Yaratın

Manuel bir dürbünler oluşturun ve At. Ömür boyu dürbünler tek kullanımlıktır ve bileşen imhasını takip eder, bu yüzden her zaman "Dispose()" diye aramayı veya "using" ifadeleriyle sarmayı unutmayın.




Etiket Ömür Dürbünleri

Bazen bazı hizmetleri bir iş birimi içinde paylaşmanız gerekebilir, ancak tekli mod gibi küresel paylaşım olanaklarını kullanmak istemezsiniz. Örneğin, bir web uygulamasının istek başına yaşam döngüsü, bu durumda yaşam döngüsünüzü ve hizmetinizi belirlemek için InstancePerMatchingLifetimeScope kullanabilirsiniz.

Örneğin, posta gönderen bir bileşen vardır ve işlem mantığı birden fazla kez mesaj göndermek zorundadır, böylece posta servisi her mantıksal işlem diliminde paylaşılabilir. E-posta bileşeninin küresel bir tek tonlu olmasını istemiyorsanız, bunu aşağıdaki şekilde ayarlayabilirsiniz.



Ömür Boyu Kapsama Kayıt Eklemek

Autofac, yaşam döngüsü oluştururken "anında ekleme" yapmanıza olanak tanır. Bu, bir tür "nokta kaynak" sınırlı kayıt geçersiz kılma yapmanız gerektiğinde veya genel olarak küresel olarak kaydetmek istemediğiniz bir dürbünde ek şeylere ihtiyacınız olduğunda yardımcı olabilir. Bunu, bir lambda ileten bir ContainerBuilder ile kayıtları ekleyen BeginLifetimeScope()'a göndererek yaparsınız. (Bir yaşam döngüsü oluştururken, ek hizmetleri küresel kayıt olmadan kaydedin)



Örnek Kapsamı

Örnek kapsamı, bir örneğin istekler arasında nasıl paylaşılacağını belirler. Bir hizmet talep edilirken, autofac tek bir örnek kapsamı, bağımlılık kapsamı başına yeni bir örnek veya bir bağlamda, örneğin bir iş parçacağı veya yaşam boyu kapsam başına HTTP isteği gibi bir tek bir dosya döndürebilir. Bu, açık bir Resolve() çağrısından döndürülen örnekler ile konteyner tarafından başka bir bileşenin bağımlılıklarını karşılamak için dahili oluşturulan örnekler için de geçerlidir.

  • Bağımlılık Başına Örnek
  • Tek Örnek
  • Yaşam Süresi Kapsamına Göre Örnek
  • Eşleşen Yaşam Süresi Kapsamına Göre Örnek
  • İstek Başına Örnek
  • Sahip Başına Örnek
  • İplik Kapsamı


Bağımlılık Başına Örnek

Diğer konteynerlerde geçici 'fabrika' olarak da adlandırılan bu sistem, hizmet istendiğinde her seferinde benzersiz bir örnek döndürür. Yaşam döngüsü belirtilmemişse, bu varsayılan davranıştır.



Her Resolve bağımlılığı yeni bir bileşen döndürür.



Tek Örnek

Aynı örnek, tüm istekler ve iç içe girmiş kapsamlar için geri döner.




Yaşam Süresi Kapsamına Göre Örnek

Bu kapsam, iç içe çevirilmiş dürbünlere uygulanabilir. Yaşam başına kapsam bileşeni, iç içe kapsam içinde en fazla bir örnek içerir. Bu, tek bir iş birimine özgü ve ek mantıksal iş birimleri iç içe geçirmesi gereken nesneler için faydalıdır. Her iç içe yaşam süresi kapsamı, kayıtlı bağımlılığın yeni bir örneğini alır.



Yaşam süresi kapsamı örnek bileşenini ayrıştırdığınızda, her iç içe alan kapsamında (örneğin iş birimi başı için) yalnızca bir örnek vardır.


Eşleşen Yaşam Süresi Kapsamına Göre Örnek

Bu, Yaşama Başına Bir Kapsama Başına Örnek (Instance Per Lifetime Scope) ile benzer, ancak kontrol daha hassas örneklerle paylaşılabilir. İç içe bir yaşam döngüsü oluşturduğunuzda, ona etiket verebilir veya isim verebilirsiniz. Yaşam süresi başına eşleşen bir bileşen, iç içe yaşam süresi kapsamı için en fazla bir örnek ve verilen bir isimle eşleşir。 Bu, iç içe döngülerin küresel örnekler oluşturmadan bileşenleri paylaşabileceği kapsamlı tekli sistemlerin oluşturulmasına olanak tanır.

İçiçe içe alınmış yaşam döngüleri olarak oluşturulan http isteği gibi tek bir iş birimi için faydalıdır. Eğer HTTP isteği başına iç içe bir ömür yaratılırsa, yaşam süresi kapsamına sahip herhangi bir bileşenin HTTP talebi başına bir örnek olur. (Aşağıda istek başına ömür boyu kapsamı hakkında daha fazla bilgi var.)

Çoğu uygulamada, bir iş birimini temsil etmek için yalnızca bir hiyerarşik konteyner iç içe geçirme yeterlidir. Birden fazla iç içe seviye gerekiyorsa (örneğin, küresel->istek->işlem), bileşenler belirli bir seviyede etiketler aracılığıyla paylaşılmak üzere oluşturulabilir.



İç içe bir yaşam döngüsü başlatıldığında, etiketler o yaşam döngüsüyle ilişkilendirilir. Doğru adlandırılmış ömür ölçüsü olmadığı bir yaşam süresi kapsamı bileşenini çözmeye çalışırsanız, istisna yaşarsınız. (Kaydedilmemiş etiketin yaşam döngüsü ayrıştırılırsa, bir istisna oluşur.)



İstek Başına Örnek

Bazı uygulama türlerinin doğal olarak "istek" tipi bir semantik vardır, örneğin ASP.NET MVC. Bu uygulama türleri arasında, bir tür "talebe başına tekli ton" olması faydalıdır. Talep başına örnek, iyi bilinen bir ömür kapsamı etiketi, kayıt kolaylığı yöntemi ve ortak uygulama için entegrasyon sağlayarak eşleşen yaşam süresi kapsamına göre örnekler üzerine inşa edilir türler (her istek başına bir örnek, her eşleşen ömür süresi kapsamının üzerine inşa edilir; bilinen bir yaşam süresi etiketi, kayıt kolaylığı yöntemi ve yaygın uygulama türleri için entegrasyon sağlanır). Temelde, eşleşen ömür boyu kapsamına göre belirlenir.

Bu, mevcut bir istek yoksa ve bir bileşeni istek başına kayıtlı olarak ayrıştırırsanız, bir istisna oluşturulacağı anlamına gelir. İstek başına ömür süreleriyle nasıl çalışılacağını ayrıntılı olarak anlatan bir SSS var.

Bağlantı girişi görünür.



Sahip Başına Örnek

Sahiplenilen örtük ilişki türü, yeni iç içe bir yaşam döngüsü yaratıyor. Bağımlılıklar, sahip olduğu bir instance-per-owned ile kayıt yaparak ana görevle sınırlanabilir.



Bu örnekte, ServiceForHandler hizmeti sahip olunan MessageHandler örneğinin ömrü boyunca kapsamlandırılacaktır.



İplik Kapsamı

Buna başvurabilirsiniz

Bağlantı girişi görünür.

Gerçek çatışma

Ömür boyu Kapsamı Başına Instance modunu kullanıyorum.

winform'da, çağrı yürütüldüğünde, her seferinde bir veritabanı bağlamı kullanır, aşağıdaki şekilde gösterilmiştir:



_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655

Çok parçacıklı iş parçacıllığı ve eşzamanlılık durumunda, aynı veritabanı bağlamını kullanırsanız, veritabanını eklerken, silirken, değiştirirken veya kontrol ederken istisnalarla karşılaşırsınız.

Butona her tıkladığımda autofac'ın yeni bir nesne döndürmesini istiyorum, kod şöyle:


Aşağıda gösterildiği gibi:



(Son)




Önceki:.NET/C# Resimleri döşemek için su işaretli metin
Önümüzdeki:ASP.NET URL biçiminde log dosyalarına erişimi yasakla
2022-9-8 09:58:24 tarihinde yayınlandı |
Tam ihtiyacımız olan şey
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com