Question

Comment puis-je passer des arguments à un constructeur dans un framework IOC? Je veux faire quelque chose comme: (essayer d'être agnostique dans le cadre de la COI;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

Il semble que cela ne soit pas possible dans StructureMap. Mais j'aimerais voir quelqu'un me prouver le contraire.

Les autres frameworks sont-ils plus riches en fonctionnalités? Ou est-ce que j'utilise le framework CIO de manière inappropriée?

Était-ce utile?

La solution

Dans la carte de structure, vous pouvez y parvenir à l'aide de la méthode With:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

Voir: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity -objects-into-services.aspx

Autres conseils

Pour Castle Windsor:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

notez l'utilisation d'un objet anonyme pour spécifier des arguments de constructeur.

en utilisant StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();

Comment cela peut-il être indépendant de la langue? C’est le détail de la mise en œuvre du cadre en question.

Spring vous permet de spécifier les arguments de c'tor en tant que liste de valeurs / références, si c'est votre cas. Ce n'est pas très lisible, cependant, comparé à l'injection de propriété.

Certaines personnes en ont très peur et insistent sur le fait que l’injection de c'tor est la seule approche fil-safe de java. Techniquement, ils ont raison, mais dans la pratique, cela n'a pas d'importance.

Cela ne devrait pas être un besoin très courant, mais parfois, il est valide. Ninject , qui est plus clair que StructureMap, vous permet de passer des paramètres lors de la récupération d'objets transitoires du contexte. Spring.NET également.

La plupart du temps, les objets déclarés dans un conteneur IoC ne sont pas transitoires et acceptent d'autres objets non transitoires via des constructeurs / propriétés / méthodes comme dépendances.

Cependant, si vous voulez vraiment utiliser le conteneur en tant qu'usine et si vous avez suffisamment de contrôle sur les objets à résoudre, vous pouvez utiliser l'injection de propriété ou de méthode même si cela semble moins naturel et plus risqué. d'une certaine manière.

Oui, d'autres frameworks sont plus riches en fonctionnalités - vous devez utiliser un framework ioc permettant l'injection de constructeur. Spring est un exemple de conteneur ioc multilingue qui permet l’injection de dépendance de constructeur.

Les autres frameworks IoC sont plus riches en fonctionnalités.

I.e. consultez la ParameterResolution avec la saisie automatique

Vous pouvez également le faire facilement avec Windsor

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top