2013-03-14 33 views
15

Delfacık fabrika modelini Autofac ile anlamaya çalışıyorum. Burada güzel açıklanmıştır Anahtarlı() kayıt ile IIndex <> kullanarak fabrika nasıl uygulanacağı biliyorum: Configuring an Autofac delegate factory that's defined on an abstract classAutofac delege fabrikası func kullanarak <>

Ben Func <> kullanarak bir fabrika oluşturabilir olmadığını bilmek istiyorum, ve bunu nasıl yapacağını

aşağıdaki örnek için kayıt:

public enum Service 
{ 
    Foo, 
    Bar 
} 

public interface FooService : IService 
{ 
    ServiceMethod(); 
} 

public interface BarService : IService 
{ 
    ServiceMethod(); 
} 

public class FooBarClient 
{ 
    private readonly IService service; 

    public FooBarClient(Func<Service, IService> service) 
    { 
     this.service = service(Service.Foo); 
    } 

    public void Process() 
    { 
     service.ServiceMethod(); // call the foo service. 
    } 
} 
+0

Neden sadece kullanmayın '' Keyed() 'ile IIndex <>' '? Autofac bu sizin için 'Func ' oluşturamaz. 'Keyed()' veya 'Named()' gibi bir şey kullanarak kapsayıcınıza kaydetmeniz gerekir: builder.Register > (c => s => c.ResolveKeyed (s)) Yetkili fabrikalar parametrelerle sadece bir tip oluşturabilir ve parametrelere dayalı bir tip seçemezler çünkü bu, 'IIndex <> 'için. – nemesv

+2

IIndex için <> Ben kaçınmaya çalıştığım Autofac kütüphanesine başvurmam gerekecek. DI kodumun sadece mümkün ise Kompozit root (ayrı kütüphane) olmasını istiyorum. –

cevap

16

Autofac bir parametreye bağlı olarak farklı türde dönmek olanak sağlayan sizin için bu Func<Service, IService> inşa edilemez. Bu, IIndex<>'un ne için olduğunu. Eğer istemiyorsanız

Ancak/IIndex<> kullanamazsınız Eğer Keyed veya Named yardımıyla bu fabrika işlevi oluşturmak ve kap içinde Fabrikanızı kayıt olabilirsiniz:

var builder = new ContainerBuilder(); 
builder.RegisterType<FooBarClient>().AsSelf(); 
builder.RegisterType<FooService>().Keyed<IService>(Service.Foo); 
builder.RegisterType<BarService>().Keyed<IService>(Service.Bar); 

builder.Register<Func<Service, IService>>(c => 
{ 
    var context = c.Resolve<IComponentContext>(); 
    return s => context.ResolveKeyed<IService>(s); 
}); 
+0

Teşekkürler nemesv! onun beklendiği gibi çalışıyor! jus bir soru, performansta bir fark olacak mı - IIndex vs Func? –

+0

IIndex'in nasıl uygulandığını ve ne tür bir zincirleme veya performans optimizasyonunun olduğunu bilmiyorum. İmplantasyonu kontrol edebilir veya ikisini karşılaştırmak için senaryonuza uygun performans testleri yapmalısınız. – nemesv

+2

Sadece bu sebepten dolayı denedim, ama bana bir 'ObjectDisposedException' veriyor ... 'yeni Foo'yu delege (' biyeig nogo! ') Içinde arayarak bunu çözdüm! –

İlgili konular