2010-05-22 10 views
13

servicios registrados Dadas las implementaciones:de autofac <T> para resolver el nombre del servicio

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

¿Puedo recuperar el nombre de la interfaz IFoo inyectando algo así como 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); 
} 

sé que puedo hacerlo con Meta<>, pero no quiero usarlo.

Respuesta

25

Se puede registrar su propio delegado de la resolución de la siguiente manera:

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

Gran idea! Gracias :). – ppiotrowicz

+3

Edición secundaria: el parámetro 'c' es temporal; necesita resolver IComponentContext si desea mantenerlo así. c => {var cc = c.Resolve (); return named => cc.Resolve (named); } –

+0

@Nicholas: ah, por supuesto, esto es demasiado fácil de ignorar :) –

Cuestiones relacionadas