2010-04-29 5 views
6

J'essaie de comprendre comment résoudre une instance quelque part dans le code.Instance de résolution - Autofac

Au démarrage de l'application I enregistré un type

static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

Maintenant, comment puis-je résoudre une instance quelque part dans le code?

En StructureMap il y a un objet statique ObjectFactory.GetInstance<IFoo>()

Répondre

10

Lire sur Getting Started. Cela devrait vous aider à démarrer.

Tout d'abord, ce que vous cherchez est le container. Construire de la ContainerBuilder comme dans cette simple application WinForms:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

L'idée générale est que vous suffit de résoudre la première ou supérieure par exemple. Le conteneur gérera la création de toutes les autres instances en fonction de l'injection de dépendance via les paramètres du constructeur.

Si le modèle DI est suivi tout au long de votre application, il vous suffit de toucher le conteneur une fois au démarrage.

La manière dont vous résolvez l'instance la plus élevée dépend en grande partie du type d'application que vous construisez. Si c'est une application web, les ASP.Net integration et MVC integration s'en occuperont pour vous. (Après tout, l'instance la plus haute dans ASP.Net est le Application qui est hors de notre contrôle). D'autre part, si c'est une application de console ou une application WinForms vous résoudrez la première instance manuellement dans Main, comme mon exemple ci-dessus.

+0

C'est l'exemple, mais que faire si j'ai besoin d'une instance dans plus de classes? Impossible d'enregistrer le type dans chaque classe. – user137348

+1

Mais vous devez résoudre l'instance la plus haute quelque part dans le code. Les types sont enregistrés au démarrage (Global.asax), puis vous devez résoudre l'instance la plus haute quelque part dans le code. Finalement, j'ai trouvé un article décrivant ceci. http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx Que pensez-vous de cette approche? – user137348

+0

Voir ma mise à jour ... et oui, l'approche @Sharpoverrides est correcte, elle s'assure que Global.asax n'est pas encombré de code de construction de conteneur. Après tout, vous devriez vraiment écrire unittests qui teste le conteneur, et avoir une classe à responsabilité unique qui construit le conteneur le rend plus facile à tester. –

Questions connexes