2010-05-22 19 views
13

Given zarejestrowane usługi:autofac za Func <T> aby rozwiązać nazwie usługa

builder.RegisterType<Foo1>().Named<IFoo>("one").As<IFoo>(); 
builder.RegisterType<Foo2>().Named<IFoo>("two").As<IFoo>(); 
builder.RegisterType<Foo3>().Named<IFoo>("three").As<IFoo>(); 

można pobrać nazwane implementacje IFoo interfejsu wstrzykując coś podobnego Func<string, IFoo>?

public class SomeClass(Func<string, IFoo> foo) { 
    var f = foo("one"); 
    Debug.Assert(f is Foo1); 

    var g = foo("two"); 
    Debug.Assert(g is Foo2); 

    var h = foo("three"); 
    Debug.Assert(h is Foo3); 
} 

Wiem, że mogę to zrobić z Meta<>, ale nie chcę z niego korzystać.

Odpowiedz

25

Można zarejestrować swoją delegata rozwiązującego tak:

builder.Register<Func<string, IFoo>>(c => 
    { 
     var cc = c.Resolve<IComponentContext>(); 
     return named => cc.ResolveNamed<IFoo>(named); 
    }); 
+0

świetny pomysł! Dzięki :). – ppiotrowicz

+3

Drobna edycja - parametr "c" jest tymczasowy; musisz rozwiązać IComponentContext, jeśli chcesz zawiesić się na nim w ten sposób. c => {var cc = c.Resolve (); return named => cc.Resolve (nazwany); } –

+0

@Nicholas: ah, oczywiście, to zbyt łatwo przeoczyć :) –

Powiązane problemy