44 lines
1.4 KiB
C#
44 lines
1.4 KiB
C#
using System;
|
|
using System.Runtime.CompilerServices;
|
|
using Reflex.Core;
|
|
using Reflex.Enums;
|
|
using Reflex.Injectors;
|
|
|
|
namespace Reflex.Resolvers
|
|
{
|
|
internal sealed class ScopedFactoryResolver : IResolver
|
|
{
|
|
private readonly Func<Container, object> _factory;
|
|
private readonly ConditionalWeakTable<Container, object> _instances = new();
|
|
public Lifetime Lifetime => Lifetime.Scoped;
|
|
public Container DeclaringContainer { get; set; }
|
|
public Resolution Resolution { get; }
|
|
|
|
public ScopedFactoryResolver(Func<Container, object> factory, Resolution resolution)
|
|
{
|
|
Diagnosis.RegisterCallSite(this);
|
|
_factory = factory;
|
|
Resolution = resolution;
|
|
}
|
|
|
|
public object Resolve(Container resolvingContainer)
|
|
{
|
|
Diagnosis.IncrementResolutions(this);
|
|
|
|
if (!_instances.TryGetValue(resolvingContainer, out var instance))
|
|
{
|
|
instance = _factory.Invoke(resolvingContainer);
|
|
_instances.Add(resolvingContainer, instance);
|
|
resolvingContainer.Disposables.TryAdd(instance);
|
|
AttributeInjector.Inject(instance, resolvingContainer);
|
|
Diagnosis.RegisterInstance(this, instance);
|
|
}
|
|
|
|
return instance;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
}
|
|
} |