ServiceRepositoryExtensions
using Stashbox.Registration.SelectionRules;
using Stashbox.Resolution;
using Stashbox.Utils.Data;
using Stashbox.Utils.Data.Immutable;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
namespace Stashbox.Registration.Extensions
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal static class ServiceRepositoryExtensions
{
public static bool ContainsRegistration(this ImmutableTree<Type, ImmutableBucket<ServiceRegistration>> repository, Type type, [System.Runtime.CompilerServices.Nullable(2)] object name, bool includeOpenGenerics)
{
ImmutableBucket<ServiceRegistration> orDefaultByRef = repository.GetOrDefaultByRef(type);
if (name != null && orDefaultByRef != null)
return Array.Exists(orDefaultByRef.Repository, (ServiceRegistration reg) => name.Equals(reg.Name));
if (orDefaultByRef != null || !includeOpenGenerics || !type.IsClosedGenericType())
return orDefaultByRef != null;
orDefaultByRef = repository.GetOrDefaultByRef(type.GetGenericTypeDefinition());
if (orDefaultByRef?.Repository != null)
return Array.Exists(orDefaultByRef.Repository, (ServiceRegistration reg) => reg.ImplementationType.SatisfiesGenericConstraintsOf(type));
return false;
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public static ServiceRegistration SelectOrDefault(this IEnumerable<ServiceRegistration> registrations, TypeInformation typeInformation, ResolutionContext resolutionContext, IRegistrationSelectionRule[] registrationSelectionRules)
{
int num = 0;
ServiceRegistration result = null;
foreach (ServiceRegistration registration in registrations) {
if (registrationSelectionRules.IsSelectionPassed(typeInformation, registration, resolutionContext, out int weight) && weight >= num) {
num = weight;
result = registration;
}
}
return result;
}
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1
})]
public static IEnumerable<ServiceRegistration> FilterExclusiveOrDefault(this IEnumerable<ServiceRegistration> registrations, TypeInformation typeInformation, ResolutionContext resolutionContext, IRegistrationSelectionRule[] registrationSelectionRules)
{
ExpandableArray<ServiceRegistration> expandableArray = new ExpandableArray<ServiceRegistration>();
ExpandableArray<ServiceRegistration> expandableArray2 = new ExpandableArray<ServiceRegistration>();
foreach (ServiceRegistration registration in registrations) {
if (registrationSelectionRules.IsSelectionPassed(typeInformation, registration, resolutionContext, out int weight)) {
if (weight > 0)
expandableArray2.Add(registration);
else
expandableArray.Add(registration);
}
}
if (expandableArray.Length == 0 && expandableArray2.Length == 0)
return null;
if (expandableArray2.Length <= 0)
return expandableArray;
return expandableArray2;
}
public static IEnumerable<ServiceRegistration> FilterInclusive(this IEnumerable<ServiceRegistration> registrations, TypeInformation typeInformation, ResolutionContext resolutionContext, IRegistrationSelectionRule[] registrationSelectionRules)
{
int weight;
return from serviceRegistration in registrations
where registrationSelectionRules.IsSelectionPassed(typeInformation, serviceRegistration, resolutionContext, out weight)
select serviceRegistration;
}
private static bool IsSelectionPassed(this IRegistrationSelectionRule[] registrationSelectionRules, TypeInformation typeInformation, ServiceRegistration serviceRegistration, ResolutionContext resolutionContext, out int weight)
{
weight = 0;
int num = registrationSelectionRules.Length;
for (int i = 0; i < num; i++) {
if (!registrationSelectionRules[i].IsValidForCurrentRequest(typeInformation, serviceRegistration, resolutionContext, out bool shouldIncrementWeight))
return false;
if (shouldIncrementWeight)
weight++;
}
return true;
}
}
}