Skip to content

Commit 028bc6e

Browse files
#88 Support for contextual/scoped dependency overrides
1 parent 5cd0b4c commit 028bc6e

9 files changed

Lines changed: 62 additions & 52 deletions

AI_CONTEXT_LARGE.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12168,15 +12168,6 @@ Atomically generated smart tag with value "Cleaner".
1216812168
</blockquote></details>
1216912169

1217012170

12171-
<details><summary>Field UniqueTag</summary><blockquote>
12172-
12173-
Atomically generated smart tag with value "UniqueTag".
12174-
It's used for:
12175-
12176-
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
12177-
</blockquote></details>
12178-
12179-
1218012171
<details><summary>Field CompositionClass</summary><blockquote>
1218112172

1218212173
Atomically generated smart tag with value "CompositionClass".
@@ -12186,10 +12177,12 @@ Atomically generated smart tag with value "CompositionClass".
1218612177
</blockquote></details>
1218712178

1218812179

12189-
<details><summary>Field Injection</summary><blockquote>
12180+
<details><summary>Field UniqueTag</summary><blockquote>
1219012181

12191-
Atomically generated smart tag with value "Injection".
12182+
Atomically generated smart tag with value "UniqueTag".
12183+
It's used for:
1219212184

12185+
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
1219312186
</blockquote></details>
1219412187

1219512188

@@ -12202,21 +12195,28 @@ Atomically generated smart tag with value "GenericType".
1220212195
</blockquote></details>
1220312196

1220412197

12205-
<details><summary>Field Override</summary><blockquote>
12198+
<details><summary>Field UsingDeclarations</summary><blockquote>
1220612199

12207-
Atomically generated smart tag with value "Override".
12200+
Atomically generated smart tag with value "UsingDeclarations".
1220812201
It's used for:
1220912202

12210-
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
12203+
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
1221112204
</blockquote></details>
1221212205

1221312206

12214-
<details><summary>Field UsingDeclarations</summary><blockquote>
12207+
<details><summary>Field Injection</summary><blockquote>
1221512208

12216-
Atomically generated smart tag with value "UsingDeclarations".
12209+
Atomically generated smart tag with value "Injection".
12210+
12211+
</blockquote></details>
12212+
12213+
12214+
<details><summary>Field Override</summary><blockquote>
12215+
12216+
Atomically generated smart tag with value "Override".
1221712217
It's used for:
1221812218

12219-
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
12219+
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
1222012220
</blockquote></details>
1222112221

1222212222

README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3468,15 +3468,6 @@ Atomically generated smart tag with value "Cleaner".
34683468
</blockquote></details>
34693469

34703470

3471-
<details><summary>Field UniqueTag</summary><blockquote>
3472-
3473-
Atomically generated smart tag with value "UniqueTag".
3474-
It's used for:
3475-
3476-
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
3477-
</blockquote></details>
3478-
3479-
34803471
<details><summary>Field CompositionClass</summary><blockquote>
34813472

34823473
Atomically generated smart tag with value "CompositionClass".
@@ -3486,10 +3477,12 @@ Atomically generated smart tag with value "CompositionClass".
34863477
</blockquote></details>
34873478

34883479

3489-
<details><summary>Field Injection</summary><blockquote>
3480+
<details><summary>Field UniqueTag</summary><blockquote>
34903481

3491-
Atomically generated smart tag with value "Injection".
3482+
Atomically generated smart tag with value "UniqueTag".
3483+
It's used for:
34923484

3485+
class _Generator__ApiInvocationProcessor_ <-- (UniqueTag) -- _IdGenerator_ as _PerResolve_
34933486
</blockquote></details>
34943487

34953488

@@ -3502,21 +3495,28 @@ Atomically generated smart tag with value "GenericType".
35023495
</blockquote></details>
35033496

35043497

3505-
<details><summary>Field Override</summary><blockquote>
3498+
<details><summary>Field UsingDeclarations</summary><blockquote>
35063499

3507-
Atomically generated smart tag with value "Override".
3500+
Atomically generated smart tag with value "UsingDeclarations".
35083501
It's used for:
35093502

3510-
class _Generator__OverrideIdProvider_ <-- _IIdGenerator_(Override) -- _IdGenerator_ as _PerResolve_
3503+
class _Generator__CompositionClassBuilder_ <-- _IBuilder`2_(UsingDeclarations) -- _UsingDeclarationsBuilder_ as _PerBlock_
35113504
</blockquote></details>
35123505

35133506

3514-
<details><summary>Field UsingDeclarations</summary><blockquote>
3507+
<details><summary>Field Injection</summary><blockquote>
35153508

3516-
Atomically generated smart tag with value "UsingDeclarations".
3509+
Atomically generated smart tag with value "Injection".
3510+
3511+
</blockquote></details>
3512+
3513+
3514+
<details><summary>Field Override</summary><blockquote>
3515+
3516+
Atomically generated smart tag with value "Override".
35173517
It's used for:
35183518

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

35223522

readme/func-with-arguments.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,14 @@ partial class Composition
121121
[MethodImpl(MethodImplOptions.AggressiveInlining)]
122122
get
123123
{
124-
var overrString2 = default(string);
125-
var overrInt320 = default(int);
124+
string overrString2;
125+
int overrInt320;
126126
Func<int, string, IDependency> perBlockFunc1 = new Func<int, string, IDependency>(
127127
[MethodImpl(MethodImplOptions.AggressiveInlining)]
128-
(int localArg135, string localArg238) =>
128+
(int localArg124, string localArg227) =>
129129
{
130-
overrInt320 = localArg135;
131-
overrString2 = localArg238;
130+
overrInt320 = localArg124;
131+
overrString2 = localArg227;
132132
if (_root._singletonClock51 is null)
133133
{
134134
using (_lock.EnterScope())

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ partial class Composition
9898
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9999
get
100100
{
101-
var overrInt320 = default(int);
101+
int overrInt320;
102102
Func<int, IDependency<string>> perBlockFunc1 = new Func<int, IDependency<string>>(
103103
[MethodImpl(MethodImplOptions.AggressiveInlining)]
104-
(int localArg14) =>
104+
(int localArg116) =>
105105
{
106-
overrInt320 = localArg14;
106+
overrInt320 = localArg116;
107107
IDependency<string> localValue139 = new Dependency<string>(overrInt320);
108108
return localValue139;
109109
});

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ partial class Composition
9898
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9999
get
100100
{
101-
var overrInt320 = default(int);
101+
int overrInt320;
102102
Func<int, IDependency> perBlockFunc1 = new Func<int, IDependency>(
103103
[MethodImpl(MethodImplOptions.AggressiveInlining)]
104-
(int localArg14) =>
104+
(int localArg116) =>
105105
{
106-
overrInt320 = localArg14;
106+
overrInt320 = localArg116;
107107
IDependency localValue98 = new Dependency(overrInt320);
108108
return localValue98;
109109
});

readme/overrides.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,10 @@ partial class Composition
153153
[MethodImpl(MethodImplOptions.AggressiveInlining)]
154154
get
155155
{
156-
var overrString2 = default(string);
157-
var overrInt320 = default(int);
158-
var overrInt321 = default(int);
159-
var overrColor3 = default(Drawing.Color);
156+
string overrString2;
157+
int overrInt320;
158+
int overrInt321;
159+
Drawing.Color overrColor3;
160160
Func<int, int, IDependency> transientFunc1 =
161161
[MethodImpl(MethodImplOptions.AggressiveInlining)]
162162
(localDependencyId0, localSubId1) =>

src/Pure.DI.Core/Core/Code/CompositionBuilder.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,17 @@ public CompositionCode Build(DependencyGraph graph)
4242
{
4343
ctx.Code.AppendLine($"var {perResolveVar.VariableName} = default({typeResolver.Resolve(graph.Source, perResolveVar.InstanceType)});");
4444
if (perResolveVar.Info.RefCount > 0
45-
&& perResolveVar.InstanceType.IsValueType
46-
&& perResolveVar.Injection.Kind != InjectionKind.Override)
45+
&& perResolveVar.InstanceType.IsValueType)
4746
{
4847
ctx.Code.AppendLine($"var {perResolveVar.VariableName}Created = false;");
4948
}
5049
}
5150

51+
foreach (var overrideVar in map.GetOverrides())
52+
{
53+
ctx.Code.AppendLine($"{typeResolver.Resolve(graph.Source, overrideVar.InstanceType)} {overrideVar.VariableName};");
54+
}
55+
5256
blockBuilder.Build(ctx, rootBlock);
5357
ctx.Code.AppendLine($"return {buildTools.OnInjected(ctx, rootBlock.Current)};");
5458
ctx.Code.AppendLines(ctx.LocalFunctionsCode.Lines);

src/Pure.DI.Core/Core/Code/IVariablesMap.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ interface IVariablesMap : IDictionary<MdBinding, Variable>
99
IEnumerable<Variable> GetSingletons();
1010

1111
IEnumerable<Variable> GetPerResolves();
12+
13+
IEnumerable<Variable> GetOverrides();
1214
}

src/Pure.DI.Core/Core/Code/VariablesMap.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public IEnumerable<Variable> GetSingletons() => this
2828
this.Any(i => i.Key.Lifetime?.Value is Lifetime.Singleton or Lifetime.Scoped or Lifetime.PerResolve);
2929

3030
public IEnumerable<Variable> GetPerResolves() => this
31-
.Where(i => i.Key.Lifetime?.Value == Lifetime.PerResolve)
31+
.Where(i => i.Key.Lifetime?.Value == Lifetime.PerResolve && i.Key.Construct is not { Kind: MdConstructKind.Override })
32+
.Select(i => i.Value);
33+
34+
public IEnumerable<Variable> GetOverrides() => this
35+
.Where(i => i.Key.Construct is { Kind: MdConstructKind.Override })
3236
.Select(i => i.Value);
3337
}

0 commit comments

Comments
 (0)