Skip to content

Commit 50f0abe

Browse files
anaximander23jeremydmiller
authored andcommitted
Allowing inverse registration syntax with provided instances.
1 parent ef974a4 commit 50f0abe

File tree

2 files changed

+74
-16
lines changed

2 files changed

+74
-16
lines changed

src/Lamar/InverseInstanceExpression.cs

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,69 @@
1-
using System;
2-
using Lamar.IoC.Instances;
1+
using Lamar.IoC.Instances;
32
using Microsoft.Extensions.DependencyInjection;
3+
using System;
44

55
namespace Lamar
66
{
77
public partial class ServiceRegistry
88
{
9-
public class InverseInstanceExpression<TImpl> where TImpl : class
9+
public class ProvidedInstanceInverseInstanceExpression<TImpl> : BaseInverseInstanceExpression<TImpl>
10+
where TImpl : class
1011
{
11-
public InverseInstanceExpression(ServiceRegistry parent)
12+
public ProvidedInstanceInverseInstanceExpression(ServiceRegistry parent, TImpl instance)
13+
: base(parent)
1214
{
13-
_parent = parent;
15+
_instance = instance;
1416
}
1517

16-
private readonly ServiceRegistry _parent;
18+
private readonly TImpl _instance;
1719

18-
public ScopedInverseInstanceExpression<TImpl> Named(string name)
20+
public override ScopedInverseInstanceExpression<TImpl> Named(string name)
1921
{
20-
return new ScopedInverseInstanceExpression<TImpl>(_parent, name);
22+
return new ScopedInverseInstanceExpression<TImpl>(Parent, _instance, name);
2123
}
2224

23-
public ScopedInverseInstanceExpression<TImpl> Scoped()
25+
public override ScopedInverseInstanceExpression<TImpl> Singleton()
2426
{
25-
return new ScopedInverseInstanceExpression<TImpl>(_parent, ServiceLifetime.Scoped);
27+
return new ScopedInverseInstanceExpression<TImpl>(Parent, _instance);
2628
}
29+
}
2730

28-
public ScopedInverseInstanceExpression<TImpl> Singleton()
31+
public class InverseInstanceExpression<TImpl> : BaseInverseInstanceExpression<TImpl>
32+
where TImpl : class
33+
{
34+
public InverseInstanceExpression(ServiceRegistry parent)
35+
: base(parent)
2936
{
30-
return new ScopedInverseInstanceExpression<TImpl>(_parent, ServiceLifetime.Singleton);
3137
}
3238

3339
public ScopedInverseInstanceExpression<TImpl> Transient()
3440
{
35-
return new ScopedInverseInstanceExpression<TImpl>(_parent, ServiceLifetime.Transient);
41+
return new ScopedInverseInstanceExpression<TImpl>(Parent, ServiceLifetime.Transient);
42+
}
43+
44+
public ScopedInverseInstanceExpression<TImpl> Scoped()
45+
{
46+
return new ScopedInverseInstanceExpression<TImpl>(Parent, ServiceLifetime.Scoped);
47+
}
48+
}
49+
50+
public class BaseInverseInstanceExpression<TImpl> where TImpl : class
51+
{
52+
public BaseInverseInstanceExpression(ServiceRegistry parent)
53+
{
54+
Parent = parent;
55+
}
56+
57+
protected ServiceRegistry Parent { get; }
58+
59+
public virtual ScopedInverseInstanceExpression<TImpl> Named(string name)
60+
{
61+
return new ScopedInverseInstanceExpression<TImpl>(Parent, name);
62+
}
63+
64+
public virtual ScopedInverseInstanceExpression<TImpl> Singleton()
65+
{
66+
return new ScopedInverseInstanceExpression<TImpl>(Parent, ServiceLifetime.Singleton);
3667
}
3768
}
3869

@@ -50,11 +81,26 @@ public ScopedInverseInstanceExpression(ServiceRegistry parent, ServiceLifetime l
5081
_lifetime = lifetime;
5182
}
5283

53-
private ServiceRegistry _parent;
84+
public ScopedInverseInstanceExpression(ServiceRegistry parent, TImpl instance, string name)
85+
{
86+
_parent = parent;
87+
_providedInstance = instance;
88+
_name = name;
89+
}
90+
91+
public ScopedInverseInstanceExpression(ServiceRegistry parent, TImpl instance)
92+
{
93+
_parent = parent;
94+
_providedInstance = instance;
5495

96+
_lifetime = ServiceLifetime.Singleton;
97+
}
98+
99+
private readonly TImpl _providedInstance;
100+
private ServiceRegistry _parent;
55101
private string _name;
56102
private ServiceLifetime _lifetime;
57-
private ConstructorInstance<TImpl> _rootInstance;
103+
private Instance _rootInstance;
58104

59105
public ScopedInverseInstanceExpression<TImpl> For<TService>()
60106
where TService : class
@@ -87,7 +133,14 @@ private void AddRootRegistration()
87133
{
88134
if (_rootInstance is null)
89135
{
90-
_rootInstance = _parent.For<TImpl>().Use<TImpl>();
136+
if (_providedInstance is null)
137+
{
138+
_rootInstance = _parent.For<TImpl>().Use<TImpl>();
139+
}
140+
else
141+
{
142+
_rootInstance = _parent.For<TImpl>().Use(_providedInstance);
143+
}
91144

92145
_rootInstance.Lifetime = _lifetime;
93146
if (!String.IsNullOrEmpty(_name))

src/Lamar/ServiceRegistry.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,11 @@ public InverseInstanceExpression<T> Use<T>() where T : class
429429
{
430430
return new InverseInstanceExpression<T>(this);
431431
}
432+
433+
public ProvidedInstanceInverseInstanceExpression<T> Use<T>(T instance) where T : class
434+
{
435+
return new ProvidedInstanceInverseInstanceExpression<T>(this, instance);
436+
}
432437
}
433438

434439
public enum DynamicAssemblySharing

0 commit comments

Comments
 (0)