J'ai le type de dépendance circulaire le plus simple dans structuremap - la classe A s'appuie sur la classe B dans son constructeur, et la classe B repose sur la classe A dans son constructeur. Pour casser la dépendance, j'ai fait que la classe B prenne la classe A comme une propriété, plutôt que comme un argument constructeur, mais structuremap se plaint encore.Dépendances circulaires dans StructureMap - peuvent-elles être rompues avec l'injection de propriété?
J'ai vu des dépendances circulaires cassées en utilisant cette méthode dans d'autres frameworks DI - est-ce un problème avec Structuremap ou est-ce que je fais quelque chose de mal?
Edit: Je dois mentionner que la propriété de la classe B est un tableau d'instances de classe A, câblé comme ceci:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Juste pour clarifier les choses, je veux la séquence suivante d'événements se produire:
- construire une instance de b, "b"
- construire une instance de a, "a", l'injection "b" dans son constructeur
- Set "b.ArrayOfA" à [ "a"]
Et je veux que tout cela se produise en utilisant autowiring, si possible ...
Edit 2: Voici un exemple simplifié que les utilisations câblage explicite jusqu'à:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
les causes de validation de configuration "dépendance bidirectionnelle problème détecté avec RequestedType: IocTest2.ILoader ..."
Salut Joshua - Je viens d'essayer et j'ai un "problème de dépendance bidirectionnel" - Je pense que c'est un signe d'une dépendance circulaire dans StructureMap? La construction et la configuration d'un objet par StructureMap sont-elles réellement atomiques, de sorte que les références circulaires ne peuvent pas être résolues? Cela semble peu probable, mais je n'ai pas réussi à le faire fonctionner jusqu'à présent ... – Andy
Le problème de dépendance bidirectionnelle indique une référence circulaire. Toutefois, l'exemple de code fourni par I fonctionnera car l'instance de B est créée avant l'appel de OnCreation lambda. Vous pouvez ensuite passer cette instance de B dans le constructeur de A, puis définir la propriété de B sur A. J'ai testé le code ci-dessus et cela fonctionne. Si vous rencontrez toujours des problèmes de référence circulaire, il doit y avoir d'autres dépendances que vous n'avez pas mentionnées. –
Je dois préciser que lorsque vous utilisez mon exemple de code, vous ne devez PAS définir de politique pour que StructureMap effectue l'injection de setter sur B. Vous effectuez manuellement l'injection de setter dans le lambda OnCreation. –