2011-02-23 14 views
5

Çoğunlukla kompozit kalıbı uygulamaya koymam gerektiğini fark ettim. Örneğin:Autofac kompozit desen

interface IService { ... } 
class Service1 : IService { ... } 
class Service2 : IService { ... } 
class CompositeService : IService 
{ 
    public CompositeService(IEnumerable<IService> services) { ... } 
    ... 
} 

CompositeService'ı IService olarak kapsayıcı olarak kaydetmek ve bağımlılıkları enjekte etmek istiyorum.

(dekoratör biraz benzer görünüyor ama hizmet yerine sadece birinin set süsleyen)

AutoFac bunu yapmanın en iyi yolu nedir?

İdeal çözüm nasıl görünür (C# için)?

Güncelleme:

Benim şu anki kaydı:

builder.RegisterType<Service1>().Named<IService>("impl"); 
builder.RegisterType<Service2>().Named<IService>("impl"); 

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl"))) 
    .As<IService>(); 

O http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

Ele tarafından Dekoratörler benzer o geliştirilebilir mi?

cevap

3

Bu uygulamaya, hatta tamamen aracılığıyla düşünmüştüm ama elde edebiliriz iyi sözdizimi değil:

builder 
.RegisterComposite<IService>((c, elements) => new CompositeService(elements)) 
.WithElementsNamed("impl"); 

kayıt fonksiyonuna elements parametre türü IEnumerable<IService> olması ve c.Resolve<IEnumerable<IService>>("impl") saklanması olacaktır.

Şimdi nasıl yazılır ...

+0

Ayrıca basit durumlar için daha basit bir sürüm öneriyoruz: 'builder.RegisterCompositeType (" impl ")'. Ben sadece yapıcıyı aramaktan hoşlanmıyorum çünkü bağımlılıklar zaten enjekte edilebilir. –

+1

@Konstantin Spirin: Bu aşırı yükü koymayı düşünmüştüm ama cevabımda neler olup bittiği konusunda açık olmak istedim. Değiştireceğim tek şey hala "WithElementsNamed" (ve ayrıca "WithElementsKeyed") yöntemlerini kullanacağım, bu yüzden çeşitli kayıt türleri için "RegisterComposite" ın aşırı yüklenmesini yapmak zorunda kalmayacağız. Diğer kayıt yöntemleri, adlandırılmış/anahtarlanmış tipler için geçerlidir. –

1

Adlandırılmış veya anahtarlı kayıtlar deneyebilirsiniz. Adlandırılmış bir kayıt, aynı arabirimin diğer kayıtlarından ayırt etmek için bir dize adı alır. Benzer şekilde, bir anahtar, birden fazla kayıt arasında ayrım yapmak için bir değer türü, örneğin bir enum kullanır. CompositeService'niz muhtemelen başka bir özel bilgi gerekmeyen tipte kayıtlı varsayılan referans olacaktır. Diğer IService bağımlılıklarını çözmek ve kurucuya iletmek için bir yönteme ihtiyacınız olacak; CompositeService için bir fabrika yöntemi işe yarayabilir.

+0

Teşekkürler! Şu an anlattığın şeyi yapıyorum. Daha akıllı ve kısa bir kod için umut ediyordum. –