2009-07-09 20 views
9

Bazı DI çerçevelerinin bunu desteklediğini biliyorum (ör. Ninject), ancak özellikle Autofac ile mümkün olup olmadığını bilmek istiyorum.Can Autofac otomatik kendiliğinden kapama yapabilir mi?

Beton sınıfı için bir Autofac konteynırı isteyebilir ve o beton sınıfını kaydetmeden enjekte edilen tüm uygun kurucu bağımlılıkları ile bir örnek geri alabilirim. Ben açıkça bağlamak asla eğer ben bu yararlı olacağını zaman iyi bir örnek ViewModels

builder.Register<MyClass>(); denilen sanki yanı, daha sonra otomatik kendisine somut sınıfını bağlamak. MVVM'de katmanlama, yalnızca ViewModel'e bağlı olan ve gevşek yazım yoluyla, ve yine de Görünümü birleştirilmiş olarak test etmeyecek şekilde olur. Bu nedenle, ViewModel'i testler için alay etmeye gerek yok - ve bu nedenle her ViewModel için bir arayüze sahip olmak için bir sebep yok. Bu durumda, "bu sınıfa çözüm bulmak için bu arayüzü kaydet" ifadesinin olağan DI modeli gereksiz bir karmaşıklıktır. builder.Register<MyClass>(); gibi açık bir şekilde kendine bağlanma, somut bir sınıf olarak basit bir şeyle uğraşırken gereksiz bir adım gibi hissettirir.

Autofac belgelerinde reflection-based registration example'un farkındayım, ama bu benim de zevkim değil. Her olası sınıfa zaman ayırmanın karmaşıklığını (ve yavaşlığını) istemiyorum; Çerçevenin bana ihtiyacım olduğunda ihtiyacım olanı vermesini istiyorum. Konfigürasyon sözleşmesi ve tüm bunlar.

Autofac'i yapılandırmanın herhangi bir yolu var mı? Böylece "Ah, bu somut bir tiptir ve henüz kimse onu kaydettirmedi, bu yüzden sadece varsayılan ayarlarla kayıtlı gibi davranacağım"?

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly()); 

hiçbir yansıması Peter Lillevold points out olarak, yapılır: ne hakkında

cevap

12
builder.RegisterTypesMatching(type => type.IsClass) 

Eğer RegisterTypesMatching (ve RegisterTypesFromAssembly) HERHANGİ yansıma YAPMAYANLARA olduğunu göreceksiniz look at the source edin. Tüm Autofac'in bu durumda yaptığı bir türü kabul eden veya olmayan bir kural kaydetmektir. Yukarıdaki örneğimde, bir sınıf olan herhangi bir türü kabul ediyorum.

RegisterfacesFromAssembly durumunda, Autofac, "çözmeye çalıştığınız türde Assembly == belirtilen düzene sahipse, o zaman size bir örnek vereceğim" yazan bir kural kaydeder.

Yani: hayır tip yansıma ölçütlerle eşleşen herhangi tipi çözülecektir

  • kayıt zamanında yapılır
    1. doğrudan somut türlerini kayıt karşılaştırıldığında

    , bu irade Autofac'in örneğin kurucu gereksinimleri. Yani, varsayılan örnek kapsamıyla tekil olan giderseniz, bu türü ilk defa çözdüğünüzde isabet alırsınız. Bir dahaki sefere, zaten oluşturulmuş tekil örneğini kullanacaktır.

    Güncelleme: Autofac 2'de, konteynerin herhangi bir şeyi çözebilmesinin daha iyi bir yolu vardır. Bu, the AnyConcreteTypeNotAlreadyRegistered registration source'u içerir.

  • +0

    Sweet - Tam olarak aradığım şey gibi geliyor. Teşekkürler! –

    2

    .

    +1

    Önceki yorumlarınızı kaldırdınız çünkü haklıydınız (düzenlemenizde açıkladığınız gibi): RegisterTypesFromAssembly adından da anlaşılacağı gibi toplu yansıma yapmaz. Bu sadece RegisterTypesMatching etrafında kısaltılmış fonksiyonlardan oluşan bir aileden biridir ve tam olarak aradığım şeyi yapar, ama çok daha ince bir kontrole sahiptir, ki bu oldukça tatlıdır. Cevabınızı ilk defa yanlış anlamayı umduğum için özür dilerim. –

    +0

    verdiğin bağlantı bozuk ... – Guillaume

    +1

    lütfen beni affet ama bu cevap 3 yaşında: P yanı sıra, o zamandan beri autofac için bir çok şey var, bunun artık herhangi bir alakalı olduğunu düşünmüyorum .. –

    İlgili konular