docs(binding): clarify registration limitation in API doc

- Add an explicit warning and usage pattern examples to the toInstance() method doc-comment.
- Explain why resolving dependencies registered with toInstance inside the same Module.builder does not work.
- Reference safe and unsafe code samples for users navigating via IDE and API documentation.
This commit is contained in:
Sergey Penkovsky
2025-09-08 09:51:40 +03:00
parent 722a4d7980
commit 482b7b0f5f

View File

@@ -160,6 +160,38 @@ class Binding<T> {
/// ```dart
/// bind<Api>().toInstance(ApiMock());
/// ```
///
/// **Important limitation:**
/// If you register several dependencies via [toInstance] inside a [`Module.builder`],
/// do _not_ use `scope.resolve<T>()` to get objects that are also being registered during the _same_ builder execution.
/// All [toInstance] bindings are applied sequentially, and at the point of registration,
/// earlier objects are not yet available for resolve.
///
/// **Correct:**
/// ```dart
/// void builder(Scope scope) {
/// final a = A();
/// final b = B(a);
/// bind<A>().toInstance(a);
/// bind<B>().toInstance(b);
/// }
/// ```
/// **Wrong:**
/// ```dart
/// void builder(Scope scope) {
/// bind<A>().toInstance(A());
/// bind<B>().toInstance(B(scope.resolve<A>())); // Error! A is not available yet.
/// }
/// ```
/// **Wrong:**
/// ```dart
/// void builder(Scope scope) {
/// bind<A>().toProvide(() => A());
/// bind<B>().toInstance(B(scope.resolve<A>())); // Error! A is not available yet.
/// }
/// ```
/// This restriction only applies to [toInstance] bindings.
/// With [toProvide]/[toProvideAsync] you may freely use `scope.resolve<T>()` in the builder or provider function.
Binding<T> toInstance(Instance<T> value) {
_resolver = InstanceResolver<T>(value);
return this;