From 0a3a081de3774e0955dcb93481ad87c81254a81c Mon Sep 17 00:00:00 2001 From: Travis Illig Date: Thu, 16 Aug 2018 07:39:36 -0700 Subject: [PATCH] Memory optimization from #919: Autofac.Builder.RegistrationBuilder. --- src/Autofac/Builder/RegistrationBuilder.cs | 16 +++++++++++----- .../OpenGenericDecoratorRegistrationSource.cs | 2 +- .../OpenGenericRegistrationSource.cs | 2 +- .../OpenGenerics/OpenGenericServiceBinder.cs | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Autofac/Builder/RegistrationBuilder.cs b/src/Autofac/Builder/RegistrationBuilder.cs index 39e3129ee..d351d41ac 100644 --- a/src/Autofac/Builder/RegistrationBuilder.cs +++ b/src/Autofac/Builder/RegistrationBuilder.cs @@ -133,7 +133,7 @@ public static class RegistrationBuilder builder.RegistrationStyle.Id, builder.RegistrationData, builder.ActivatorData.Activator, - builder.RegistrationData.Services, + builder.RegistrationData.Services.ToArray(), builder.RegistrationStyle.Target); } @@ -149,7 +149,7 @@ public static class RegistrationBuilder Guid id, RegistrationData data, IInstanceActivator activator, - IEnumerable services) + Service[] services) { return CreateRegistration(id, data, activator, services, null); } @@ -170,7 +170,7 @@ public static class RegistrationBuilder Guid id, RegistrationData data, IInstanceActivator activator, - IEnumerable services, + Service[] services, IComponentRegistration target) { if (activator == null) throw new ArgumentNullException(nameof(activator)); @@ -179,9 +179,15 @@ public static class RegistrationBuilder var limitType = activator.LimitType; if (limitType != typeof(object)) { - foreach (var ts in services.OfType()) + foreach (var ts in services) { - if (!ts.ServiceType.GetTypeInfo().IsAssignableFrom(limitType.GetTypeInfo())) + var asServiceWithType = ts as IServiceWithType; + if (asServiceWithType == null) + { + continue; + } + + if (!asServiceWithType.ServiceType.GetTypeInfo().IsAssignableFrom(limitType.GetTypeInfo())) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, RegistrationBuilderResources.ComponentDoesNotSupportService, limitType, ts)); } diff --git a/src/Autofac/Features/OpenGenerics/OpenGenericDecoratorRegistrationSource.cs b/src/Autofac/Features/OpenGenerics/OpenGenericDecoratorRegistrationSource.cs index 094e8702b..6e0d6e44c 100644 --- a/src/Autofac/Features/OpenGenerics/OpenGenericDecoratorRegistrationSource.cs +++ b/src/Autofac/Features/OpenGenerics/OpenGenericDecoratorRegistrationSource.cs @@ -60,7 +60,7 @@ public IEnumerable RegistrationsFor(Service service, Fun if (registrationAccessor == null) throw new ArgumentNullException(nameof(registrationAccessor)); Type constructedImplementationType; - IEnumerable services; + Service[] services; if (OpenGenericServiceBinder.TryBindServiceType(service, _registrationData.Services, _activatorData.ImplementationType, out constructedImplementationType, out services)) { var swt = (IServiceWithType)service; diff --git a/src/Autofac/Features/OpenGenerics/OpenGenericRegistrationSource.cs b/src/Autofac/Features/OpenGenerics/OpenGenericRegistrationSource.cs index 92cd9302e..3447fc478 100644 --- a/src/Autofac/Features/OpenGenerics/OpenGenericRegistrationSource.cs +++ b/src/Autofac/Features/OpenGenerics/OpenGenericRegistrationSource.cs @@ -60,7 +60,7 @@ public IEnumerable RegistrationsFor(Service service, Fun if (registrationAccessor == null) throw new ArgumentNullException(nameof(registrationAccessor)); Type constructedImplementationType; - IEnumerable services; + Service[] services; if (OpenGenericServiceBinder.TryBindServiceType(service, _registrationData.Services, _activatorData.ImplementationType, out constructedImplementationType, out services)) { yield return RegistrationBuilder.CreateRegistration( diff --git a/src/Autofac/Features/OpenGenerics/OpenGenericServiceBinder.cs b/src/Autofac/Features/OpenGenerics/OpenGenericServiceBinder.cs index 93b4ec1ac..4d96f61b9 100644 --- a/src/Autofac/Features/OpenGenerics/OpenGenericServiceBinder.cs +++ b/src/Autofac/Features/OpenGenerics/OpenGenericServiceBinder.cs @@ -41,7 +41,7 @@ internal static class OpenGenericServiceBinder IEnumerable configuredOpenGenericServices, Type openGenericImplementationType, out Type constructedImplementationType, - out IEnumerable constructedServices) + out Service[] constructedServices) { var swt = service as IServiceWithType; if (swt != null && swt.ServiceType.GetTypeInfo().IsGenericType)