robotlegs / robotlegs-framework

An ActionScript 3 application framework for Flash and Flex
https://robotlegs.tenderapp.com/
MIT License
967 stars 261 forks source link

Cross Injecting into Models results in Stack overflow (v2.0.0) #157

Closed stephanlindauer closed 4 years ago

stephanlindauer commented 10 years ago

If I have a Model "blaModel" that wants to get the "fooModel" injected and the other way around I would get a Stacktrace like this one:

Error: Error #1023: Stack overflow occurred. at org.swiftsuspenders.dependencyproviders::SingletonProvider/createResponse()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:61] at org.swiftsuspenders.dependencyproviders::SingletonProvider/apply()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:49] at org.swiftsuspenders.typedescriptions::PropertyInjectionPoint/applyInjection()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/typedescriptions/PropertyInjectionPoint.as:52] at org.swiftsuspenders::Injector/applyInjectionPoints()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/Injector.as:692] at org.swiftsuspenders::Injector/instantiateUnmapped()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/Injector.as:430] at org.swiftsuspenders.dependencyproviders::SingletonProvider/createResponse()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:61] at org.swiftsuspenders.dependencyproviders::SingletonProvider/apply()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:49] at org.swiftsuspenders.typedescriptions::PropertyInjectionPoint/applyInjection()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/typedescriptions/PropertyInjectionPoint.as:52] at org.swiftsuspenders::Injector/applyInjectionPoints()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/Injector.as:692] at org.swiftsuspenders::Injector/instantiateUnmapped()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/Injector.as:430] at org.swiftsuspenders.dependencyproviders::SingletonProvider/createResponse()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:61] at org.swiftsuspenders.dependencyproviders::SingletonProvider/apply()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/dependencyproviders/SingletonProvider.as:49] at org.swiftsuspenders.typedescriptions::PropertyInjectionPoint/applyInjection()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/typedescriptions/PropertyInjectionPoint.as:52] at org.swiftsuspenders::Injector/applyInjectionPoints()[/Development/projects/SwiftSuspenders/src/org/swiftsuspenders/Injector.as:692]

and so on....

I feel like cross injecting Models should be possible just because I can't see any architectural concerns against it.

creynders commented 10 years ago

Hi,

Circular references aren't allowed. And, IMO, they're not architecturally sound. When two components have a strong dependency on each other it's a clear indication something's wrong. Why exactly do they need a (injected) dependency on each other? There's a number of work-arounds:

  1. creating a third model
  2. composing the model in the other model
  3. merging the two models
  4. a dedicated factory which composes the models and satisfies their mutual dependencies
  5. etc.

All depends on the situation, how they interact with each other and the rest of the system.