2010-05-22 11 views
13

Compte tenu des services enregistrés:autofac <T> pour résoudre le nom de service

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

Puis-je récupérer nommés implémentations de l'interface IFoo en injectant quelque chose comme 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); 
} 

Je sais que je peux le faire avec Meta<>, mais je ne veux pas l'utiliser.

Répondre

25

Vous pouvez enregistrer votre propre délégué résoudre comme ceci:

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

Excellente idée! Merci :). – ppiotrowicz

+3

Modification mineure - le paramètre 'c' est temporaire; vous devez résoudre IComponentContext si vous voulez vous y accrocher comme ça. c => {var cc = c.Résolve (); return named => cc.Resolve (nommé); } –

+0

@Nicholas: ah, bien sûr, c'est trop facile à oublier :) –