2010-01-08 5 views
2

J'utilise actuellement Autofac, mais je suis également ouvert aux commentaires concernant d'autres conteneurs IOC. Je préférerais une solution utilisant Autofac si possible. Je suis aussi un peu nouveau à IOC, donc je peux mal comprendre ce que je devrais utiliser un conteneur IOC pour.Conteneur IOC/Autofac

En fait, la situation est la suivante:

J'ai un conteneur le plus élevé du CIO pour mon application. J'ai un arbre de conteneurs/portées enfant où je voudrais que le même "service" (IWhatever) se résolve différemment selon le niveau de l'arbre où il est résolu. De plus, si un service n'est pas enregistré à un certain niveau dans l'arborescence, je souhaite que l'arborescence soit déplacée vers le haut jusqu'à ce qu'une implémentation appropriée soit trouvée.

En outre, lors de la construction d'un composant donné, il est tout à fait possible que j'aie besoin d'accéder au conteneur/portée parent. Dans de nombreux cas, le composant que j'inscris dépendra du même service ou d'un service différent dans une portée parent.

Existe-t-il un moyen d'exprimer cette dépendance avec Autofac? Quelque chose comme:

builder.Register(c=> 
{ 
    var parentComponent = ?.Resolve<ISomeService>(); 
    var childComponent = new ConcreteService(parentComponent, args...); 
    return childComponent; 
}).As<ISomeService>(); 

Je ne peux pas obtenir quelque chose de semblable à l'pseudocode ci-dessus pour travailler pour plusieurs raisons:

A) Il semble que tous les niveaux de la part de l'arbre de portée un ensemble d'enregistrements. Je n'arrive pas à trouver un moyen de rendre un enregistrement donné confiné à une certaine "portée".

B) Je n'arrive pas à trouver un moyen de mettre la main sur la portée parent d'une portée donnée. Je peux résoudre ILifetimeScope dans le conteneur, puis le renvoyer à une instance LifetimeScope concrète qui fournit sa portée parente, mais je suppose que cette note est probablement destinée à être utilisée de cette manière. Est-ce sûr? C) Je ne sais pas comment dire à Autofac quel conteneur possède l'objet résolu. Pour beaucoup de composants, j'aimerais que le composant soit "possédé" par la portée dans laquelle il est construit. Les contextes marqués pourraient-ils m'aider ici? Devrais-je étiqueter chaque niveau de l'arbre avec un tag unique? Cela serait difficile car la profondeur de l'arbre est déterminée à l'exécution.

Désolé pour la question extrêmement longue. En résumé:

1) Est-il possible de faire ce que je veux faire avec Autofac?

2) Y a-t-il un autre conteneur plus adapté à ce type de structure de dépendance?

3) Le CIO n'est-il pas le mauvais outil pour cela?

Répondre

2

Autofac 1.4 supporte cela facilement et est probablement le meilleur choix ici en ce moment. Vous pouvez simplement enregistrer les composants du conteneur enfant dans le conteneur enfant.

Autofac 2, que vous utilisez, n'a pas encore d'équivalent simple, bien qu'il soit à l'étude.

+0

Excellent. Merci pour l'aide - on dirait que je vais devoir régresser à 1,4 (pour l'instant). Juste par curiosité, pourquoi enlever ce comportement? Les cas d'utilisation les plus courants sont-ils mieux pris en charge par le modèle de portée de vie AutoFac 2 où les étendues de durée de vie partagent un enregistrement commun? Ou est simplement parce qu'autofac 2 est encore incomplet. En tout cas - merci beaucoup pour l'aide! – Krazzy

+0

De rien. Autofac 2 devrait finalement supporter cela, mais le modèle est différent, donc la mise en œuvre va prendre quelques réflexions.La modification du modèle facilite beaucoup l'ajout d'adaptateurs pour les tâches de ce type qui nécessiteraient sinon une manipulation du conteneur. Bonne chance! –