Skip to content

Commit 0355b0b

Browse files
Update README.md
1 parent 84dfe14 commit 0355b0b

8 files changed

Lines changed: 215 additions & 54 deletions

AI_CONTEXT_LARGE.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12171,15 +12171,6 @@ DI.Setup("Composition")
1217112171
</blockquote></details>
1217212172

1217312173

12174-
<details><summary>Field UniqueTag</summary><blockquote>
12175-
12176-
Atomically generated smart tag with value "UniqueTag".
12177-
It's used for:
12178-
12179-
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
12180-
</blockquote></details>
12181-
12182-
1218312174
<details><summary>Field Overrider</summary><blockquote>
1218412175

1218512176
Atomically generated smart tag with value "Overrider".
@@ -12198,46 +12189,55 @@ Atomically generated smart tag with value "Cleaner".
1219812189
</blockquote></details>
1219912190

1220012191

12201-
<details><summary>Field Override</summary><blockquote>
12192+
<details><summary>Field UniqueTag</summary><blockquote>
1220212193

12203-
Atomically generated smart tag with value "Override".
12194+
Atomically generated smart tag with value "UniqueTag".
1220412195
It's used for:
1220512196

12206-
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
12197+
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
1220712198
</blockquote></details>
1220812199

1220912200

12210-
<details><summary>Field UsingDeclarations</summary><blockquote>
12201+
<details><summary>Field GenericType</summary><blockquote>
1221112202

12212-
Atomically generated smart tag with value "UsingDeclarations".
12203+
Atomically generated smart tag with value "GenericType".
1221312204
It's used for:
1221412205

12215-
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
12206+
class _Generator__TypeResolver_ <-- _IIdGenerator_(GenericType) -- _IdGenerator_ as _PerResolve_
1221612207
</blockquote></details>
1221712208

1221812209

12219-
<details><summary>Field CompositionClass</summary><blockquote>
12210+
<details><summary>Field Injection</summary><blockquote>
1222012211

12221-
Atomically generated smart tag with value "CompositionClass".
12212+
Atomically generated smart tag with value "Injection".
12213+
12214+
</blockquote></details>
12215+
12216+
12217+
<details><summary>Field Override</summary><blockquote>
12218+
12219+
Atomically generated smart tag with value "Override".
1222212220
It's used for:
1222312221

12224-
class _Generator__CodeBuilder_ <-- _IBuilder`2_(CompositionClass) -- _CompositionClassBuilder_ as _PerBlock_
12222+
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
1222512223
</blockquote></details>
1222612224

1222712225

12228-
<details><summary>Field GenericType</summary><blockquote>
12226+
<details><summary>Field CompositionClass</summary><blockquote>
1222912227

12230-
Atomically generated smart tag with value "GenericType".
12228+
Atomically generated smart tag with value "CompositionClass".
1223112229
It's used for:
1223212230

12233-
class _Generator__TypeResolver_ <-- _IIdGenerator_(GenericType) -- _IdGenerator_ as _PerResolve_
12231+
class _Generator__CodeBuilder_ <-- _IBuilder`2_(CompositionClass) -- _CompositionClassBuilder_ as _PerBlock_
1223412232
</blockquote></details>
1223512233

1223612234

12237-
<details><summary>Field Injection</summary><blockquote>
12235+
<details><summary>Field UsingDeclarations</summary><blockquote>
1223812236

12239-
Atomically generated smart tag with value "Injection".
12237+
Atomically generated smart tag with value "UsingDeclarations".
12238+
It's used for:
1224012239

12240+
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
1224112241
</blockquote></details>
1224212242

1224312243

README.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3450,15 +3450,6 @@ DI.Setup("Composition")
34503450
</blockquote></details>
34513451

34523452

3453-
<details><summary>Field UniqueTag</summary><blockquote>
3454-
3455-
Atomically generated smart tag with value "UniqueTag".
3456-
It's used for:
3457-
3458-
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
3459-
</blockquote></details>
3460-
3461-
34623453
<details><summary>Field Overrider</summary><blockquote>
34633454

34643455
Atomically generated smart tag with value "Overrider".
@@ -3477,46 +3468,55 @@ Atomically generated smart tag with value "Cleaner".
34773468
</blockquote></details>
34783469

34793470

3480-
<details><summary>Field Override</summary><blockquote>
3471+
<details><summary>Field UniqueTag</summary><blockquote>
34813472

3482-
Atomically generated smart tag with value "Override".
3473+
Atomically generated smart tag with value "UniqueTag".
34833474
It's used for:
34843475

3485-
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
3476+
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
34863477
</blockquote></details>
34873478

34883479

3489-
<details><summary>Field UsingDeclarations</summary><blockquote>
3480+
<details><summary>Field GenericType</summary><blockquote>
34903481

3491-
Atomically generated smart tag with value "UsingDeclarations".
3482+
Atomically generated smart tag with value "GenericType".
34923483
It's used for:
34933484

3494-
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
3485+
class _Generator__TypeResolver_ <-- _IIdGenerator_(GenericType) -- _IdGenerator_ as _PerResolve_
34953486
</blockquote></details>
34963487

34973488

3498-
<details><summary>Field CompositionClass</summary><blockquote>
3489+
<details><summary>Field Injection</summary><blockquote>
34993490

3500-
Atomically generated smart tag with value "CompositionClass".
3491+
Atomically generated smart tag with value "Injection".
3492+
3493+
</blockquote></details>
3494+
3495+
3496+
<details><summary>Field Override</summary><blockquote>
3497+
3498+
Atomically generated smart tag with value "Override".
35013499
It's used for:
35023500

3503-
class _Generator__CodeBuilder_ <-- _IBuilder`2_(CompositionClass) -- _CompositionClassBuilder_ as _PerBlock_
3501+
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
35043502
</blockquote></details>
35053503

35063504

3507-
<details><summary>Field GenericType</summary><blockquote>
3505+
<details><summary>Field CompositionClass</summary><blockquote>
35083506

3509-
Atomically generated smart tag with value "GenericType".
3507+
Atomically generated smart tag with value "CompositionClass".
35103508
It's used for:
35113509

3512-
class _Generator__TypeResolver_ <-- _IIdGenerator_(GenericType) -- _IdGenerator_ as _PerResolve_
3510+
class _Generator__CodeBuilder_ <-- _IBuilder`2_(CompositionClass) -- _CompositionClassBuilder_ as _PerBlock_
35133511
</blockquote></details>
35143512

35153513

3516-
<details><summary>Field Injection</summary><blockquote>
3514+
<details><summary>Field UsingDeclarations</summary><blockquote>
35173515

3518-
Atomically generated smart tag with value "Injection".
3516+
Atomically generated smart tag with value "UsingDeclarations".
3517+
It's used for:
35193518

3519+
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
35203520
</blockquote></details>
35213521

35223522

readme/func-with-arguments.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,12 @@ partial class Composition
125125
int overInt320;
126126
Func<int, string, IDependency> perBlockFunc1;
127127
var localLockObject105 = new Object();
128-
Func<int, string, IDependency> localFactory106 = new Func<int, string, IDependency>((int localArg122, string localArg227) =>
128+
Func<int, string, IDependency> localFactory106 = new Func<int, string, IDependency>((int localArg115, string localArg222) =>
129129
{
130130
lock (localLockObject105)
131131
{
132-
overInt320 = localArg122;
133-
overString2 = localArg227;
132+
overInt320 = localArg115;
133+
overString2 = localArg222;
134134
if (_root._singletonClock51 is null)
135135
{
136136
using (_lock.EnterScope())

readme/generic-async-composition-roots-with-constraints.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ classDiagram
183183
OtherServiceᐸT2ᐳ --|> IServiceᐸT2ˏBooleanᐳ : "Other"
184184
ServiceᐸT2ˏT3ᐳ --|> IServiceᐸT2ˏT3ᐳ
185185
DependencyᐸT2ᐳ --|> IDependencyᐸT2ᐳ
186-
Composition ..> TaskᐸIServiceᐸT2ˏBooleanᐳᐳ : TaskᐸIServiceᐸT2ˏBooleanᐳᐳ GetOtherServiceAsyncᐸT2ᐳ(System.Threading.CancellationToken cancellationToken)
187186
Composition ..> TaskᐸIServiceᐸT2ˏT3ᐳᐳ : TaskᐸIServiceᐸT2ˏT3ᐳᐳ GetMyRootAsyncᐸT2ˏT3ᐳ(System.Threading.CancellationToken cancellationToken)
188187
TaskᐸIServiceᐸT2ˏBooleanᐳᐳ o-- "PerBlock" FuncᐸIServiceᐸT2ˏBooleanᐳᐳ : "Other" FuncᐸIServiceᐸT2ˏBooleanᐳᐳ
189188
TaskᐸIServiceᐸT2ˏBooleanᐳᐳ o-- "PerBlock" TaskFactoryᐸIServiceᐸT2ˏBooleanᐳᐳ : TaskFactoryᐸIServiceᐸT2ˏBooleanᐳᐳ

readme/generic-injections-as-required-with-arguments.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,11 @@ partial class Composition
101101
int overInt320;
102102
Func<int, IDependency<string>> perBlockFunc1;
103103
var localLockObject143 = new Object();
104-
Func<int, IDependency<string>> localFactory144 = new Func<int, IDependency<string>>((int localArg18) =>
104+
Func<int, IDependency<string>> localFactory144 = new Func<int, IDependency<string>>((int localArg14) =>
105105
{
106106
lock (localLockObject143)
107107
{
108-
overInt320 = localArg18;
108+
overInt320 = localArg14;
109109
IDependency<string> localValue145 = new Dependency<string>(overInt320);
110110
return localValue145;
111111
}

readme/injections-as-required-with-arguments.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,11 @@ partial class Composition
113113
int overInt320;
114114
Func<int, IDependency> perBlockFunc1;
115115
var localLockObject98 = new Object();
116-
Func<int, IDependency> localFactory99 = new Func<int, IDependency>((int localArg18) =>
116+
Func<int, IDependency> localFactory99 = new Func<int, IDependency>((int localArg14) =>
117117
{
118118
lock (localLockObject98)
119119
{
120-
overInt320 = localArg18;
120+
overInt320 = localArg14;
121121
IDependency localValue100 = new Dependency(overInt320);
122122
return localValue100;
123123
}

readme/tracking-async-disposable-instances-per-a-composition-root.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,67 @@ partial class Composition
162162
[MethodImpl(MethodImplOptions.AggressiveInlining)]
163163
public object Resolve(Type type)
164164
{
165+
var index = (int)(_bucketSize * ((uint)RuntimeHelpers.GetHashCode(type) % 1));
166+
ref var pair = ref _buckets[index];
167+
return pair.Key == type ? pair.Value.Resolve(this) : Resolve(type, index);
168+
}
169+
170+
[MethodImpl(MethodImplOptions.NoInlining)]
171+
private object Resolve(Type type, int index)
172+
{
173+
var finish = index + _bucketSize;
174+
while (++index < finish)
175+
{
176+
ref var pair = ref _buckets[index];
177+
if (pair.Key == type)
178+
{
179+
return pair.Value.Resolve(this);
180+
}
181+
}
182+
165183
throw new InvalidOperationException($"{CannotResolveMessage} {OfTypeMessage} {type}.");
166184
}
167185

168186
[MethodImpl(MethodImplOptions.AggressiveInlining)]
169187
public object Resolve(Type type, object? tag)
170188
{
189+
var index = (int)(_bucketSize * ((uint)RuntimeHelpers.GetHashCode(type) % 1));
190+
ref var pair = ref _buckets[index];
191+
return pair.Key == type ? pair.Value.ResolveByTag(this, tag) : Resolve(type, tag, index);
192+
}
193+
194+
[MethodImpl(MethodImplOptions.NoInlining)]
195+
private object Resolve(Type type, object? tag, int index)
196+
{
197+
var finish = index + _bucketSize;
198+
while (++index < finish)
199+
{
200+
ref var pair = ref _buckets[index];
201+
if (pair.Key == type)
202+
{
203+
return pair.Value.ResolveByTag(this, tag);
204+
}
205+
}
206+
171207
throw new InvalidOperationException($"{CannotResolveMessage} \"{tag}\" {OfTypeMessage} {type}.");
172208
}
173209

210+
private readonly static int _bucketSize;
211+
private readonly static Pair<Type, IResolver<Composition, object>>[] _buckets;
212+
213+
static Composition()
214+
{
215+
var valResolver_0000 = new Resolver_0000();
216+
Resolver<Owned<IService>>.Value = valResolver_0000;
217+
_buckets = Buckets<Type, IResolver<Composition, object>>.Create(
218+
1,
219+
out _bucketSize,
220+
new Pair<Type, IResolver<Composition, object>>[1]
221+
{
222+
new Pair<Type, IResolver<Composition, object>>(typeof(Owned<IService>), valResolver_0000)
223+
});
224+
}
225+
174226
private const string CannotResolveMessage = "Cannot resolve composition root ";
175227
private const string OfTypeMessage = "of type ";
176228

@@ -188,6 +240,35 @@ partial class Composition
188240
throw new InvalidOperationException($"{CannotResolveMessage}\"{tag}\" {OfTypeMessage}{typeof(T)}.");
189241
}
190242
}
243+
244+
private sealed class Resolver_0000: Resolver<Owned<IService>>, IResolver<Composition, object>
245+
{
246+
public override Owned<IService> Resolve(Composition composition)
247+
{
248+
return composition.Root;
249+
}
250+
251+
public override Owned<IService> ResolveByTag(Composition composition, object tag)
252+
{
253+
switch (tag)
254+
{
255+
case null:
256+
return composition.Root;
257+
258+
default:
259+
return base.ResolveByTag(composition, tag);
260+
}
261+
}
262+
object IResolver<Composition, object>.Resolve(Composition composition)
263+
{
264+
return Resolve(composition);
265+
}
266+
267+
object IResolver<Composition, object>.ResolveByTag(Composition composition, object tag)
268+
{
269+
return ResolveByTag(composition, tag);
270+
}
271+
}
191272
}
192273
```
193274

0 commit comments

Comments
 (0)