2009-10-18 4 views
0

Je joue avec un peu d'injection de dépendance (StructureMap) avec mon application ASP.NET MVC. Fonctionne très bien.Can Dépendance Délai d'injection créant des objets requis?

Becuase StructureMap utilise DI via le constructeur le plus Gready (je l'espère, je suis arrivé ce concept nommé à droite), je suis sous l'impression qu'il crée une instance d'un objet pour chaque argument, dans le constructeur le plus Gready . Donc, est-il possible de dire à un framework DI (dans ce cas, c'est StructureMap mais je suis curieux de savoir s'il peut le faire pour tout autre framework .NET DI) de ne pas créer l'instance quand le constructeur est appelé, mais pour retarder la construction de cet objet jusqu'à ce que requis?

sorta comme une construction ou quelque chose ...

+0

Je serais surpris si vous ne pouvez pas. J'ai trouvé comment désactiver le comportement d'injection par défaut qui pourrait être utile si vous ne trouvez pas la méthode 'by design': http://structuremap.sourceforge.net/FAQ.htm#FAQ11 –

Répondre

1

objet paresseux Tous les cadres de di qui prennent en charge singleton-> Session/demande correspondances scope instancier généralement un objet proxy au lieu de l'objet « réel » quand les besoins d'un objet singleton pour accéder à un objet étendu de session. La construction de l'instance "réelle" est normalement reportée à la première fois qu'une méthode sur le proxy est invoquée. Je crois que castle windsor soutient ce mécanisme.

0

Réponse courte: Oui, vous pouvez le faire. Enregistrez vos types en utilisant la classe .Net 4 Lazy<T> comme ceci:

x.For(typeof(Lazy<>)).Use(typeof(Lazy<>)) 
.CtorDependency<bool>("isThreadSafe").Is(true); 

Pour la longue réponse et l'explication, voir ma réponse à la question 6811956. Je pense que cela vous donnera ce dont vous avez besoin. Si vous n'utilisez pas .Net 4, vous devrez implémenter votre propre classe Lazy<T> pour le retirer. Voir la question 3207580 comme point de départ.

Does Structuremap support Lazy out of the box?

Implementation of Lazy<T> for .NET 3.5

MISE À JOUR: En StructureMap 3, "CtorDependency" est devenu simplement "Ctor", mais semble par ailleurs travailler la même chose.

+0

Cette question ne posait pas de questions sur les Lazy spécifiques type, donc je pense que cette réponse, bien que utile, est un peu un détour. La réponse la plus simple est d'accepter simplement un Func à la place de vos arguments constructeur. –

+0

Il demandait s'il était possible de retarder la création des objets, et j'ai montré comment le faire en utilisant la classe Lazy , puisque c'est précisément ce à quoi elle est destinée. Accepter Func est juste une autre façon d'accomplir la même chose, seulement maintenant vous êtes responsable de la mise en cache des résultats de la première exécution afin de ne pas créer une nouvelle copie chaque fois que vous faites référence au Func. Je trouve la classe Lazy pour être un moyen propre d'éviter ces problèmes, et c'est donc l'approche que je recommanderais pour résoudre le problème initial. – Mel

Questions connexes