From dee562d34acf5255b204ac7b5051a875c99435ec Mon Sep 17 00:00:00 2001 From: hadashiA Date: Wed, 20 Dec 2023 17:10:38 +0900 Subject: [PATCH 1/2] FIx for unity older version --- .../InstanceProviders/OpenGenericInstanceProvider.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs b/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs index bc635348..c7d62b2c 100644 --- a/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs +++ b/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs @@ -26,7 +26,7 @@ public OpenGenericInstanceProvider(Type implementationType, Lifetime lifetime, public Registration GetClosedRegistration(Type closedInterfaceType, Type[] typeParameters) { - var typeParametersHash = typeParametersHashes.GetOrAdd(closedInterfaceType, static (_, arg) => + var typeParametersHash = typeParametersHashes.GetOrAdd(closedInterfaceType, (_, arg) => ((IStructuralEquatable)arg).GetHashCode(EqualityComparer.Default), typeParameters); var registrationArgs = new RegistrationArguments @@ -37,8 +37,7 @@ public Registration GetClosedRegistration(Type closedInterfaceType, Type[] typeP TypeParameters = typeParameters }; - return registrations.GetOrAdd(typeParametersHash, static (_, args) => - CreateRegistration(args), registrationArgs); + return registrations.GetOrAdd(typeParametersHash, (_, args) => CreateRegistration(args), registrationArgs); } private static Registration CreateRegistration(RegistrationArguments args) From 30e49a73fcb5ecc989a670d8d68550b9ac68580e Mon Sep 17 00:00:00 2001 From: hadashiA Date: Wed, 20 Dec 2023 18:11:11 +0900 Subject: [PATCH 2/2] Fix --- .../OpenGenericInstanceProvider.cs | 67 ++++++++++--------- VContainer/Packages/packages-lock.json | 33 +++------ VContainer/ProjectSettings/ProjectVersion.txt | 4 +- 3 files changed, 48 insertions(+), 56 deletions(-) diff --git a/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs b/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs index c7d62b2c..e316d600 100644 --- a/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs +++ b/VContainer/Assets/VContainer/Runtime/Internal/InstanceProviders/OpenGenericInstanceProvider.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; @@ -7,58 +6,62 @@ namespace VContainer.Internal { public class OpenGenericInstanceProvider : IInstanceProvider { + class TypeParametersEqualityComparer : IEqualityComparer + { + public bool Equals(Type[] x, Type[] y) + { + if (x == null || y == null) return x == y; + if (x.Length != y.Length) return false; + + for (var i = 0; i < x.Length; i++) + { + if (x[i] != y[i]) return false; + } + return true; + } + + public int GetHashCode(Type[] typeParameters) + { + var hash = 5381; + foreach (var typeParameter in typeParameters) + { + hash = ((hash << 5) + hash) ^ typeParameter.GetHashCode(); + } + return hash; + } + } + readonly Lifetime lifetime; readonly Type implementationType; readonly IReadOnlyList customParameters; - readonly ConcurrentDictionary registrations; - readonly ConcurrentDictionary typeParametersHashes; + readonly ConcurrentDictionary constructedRegistrations = new ConcurrentDictionary(new TypeParametersEqualityComparer()); + readonly Func createRegistrationFunc; - public OpenGenericInstanceProvider(Type implementationType, Lifetime lifetime, - List injectParameters) + public OpenGenericInstanceProvider(Type implementationType, Lifetime lifetime, List injectParameters) { this.implementationType = implementationType; this.lifetime = lifetime; customParameters = injectParameters; - typeParametersHashes = new ConcurrentDictionary(); - registrations = new ConcurrentDictionary(); + createRegistrationFunc = CreateRegistration; } public Registration GetClosedRegistration(Type closedInterfaceType, Type[] typeParameters) { - var typeParametersHash = typeParametersHashes.GetOrAdd(closedInterfaceType, (_, arg) => - ((IStructuralEquatable)arg).GetHashCode(EqualityComparer.Default), typeParameters); - - var registrationArgs = new RegistrationArguments - { - ImplementationType = implementationType, - Lifetime = lifetime, - CustomParameters = customParameters, - TypeParameters = typeParameters - }; - - return registrations.GetOrAdd(typeParametersHash, (_, args) => CreateRegistration(args), registrationArgs); + return constructedRegistrations.GetOrAdd(typeParameters, createRegistrationFunc); } - private static Registration CreateRegistration(RegistrationArguments args) + Registration CreateRegistration(Type[] typeParameters) { - var newType = args.ImplementationType.MakeGenericType(args.TypeParameters); + var newType = implementationType.MakeGenericType(typeParameters); var injector = InjectorCache.GetOrBuild(newType); - var spawner = new InstanceProvider(injector, args.CustomParameters); - return new Registration(newType, args.Lifetime, new List(1) { newType }, spawner); + var spawner = new InstanceProvider(injector, customParameters); + return new Registration(newType, lifetime, new List(1) { newType }, spawner); } public object SpawnInstance(IObjectResolver resolver) { throw new InvalidOperationException(); } - - private struct RegistrationArguments - { - public Type ImplementationType; - public Lifetime Lifetime; - public IReadOnlyList CustomParameters; - public Type[] TypeParameters; - } - } + } } \ No newline at end of file diff --git a/VContainer/Packages/packages-lock.json b/VContainer/Packages/packages-lock.json index 606aaa0a..c9c4c7e2 100644 --- a/VContainer/Packages/packages-lock.json +++ b/VContainer/Packages/packages-lock.json @@ -1,21 +1,5 @@ { "dependencies": { - "com.cysharp.runtimeunittesttoolkit": { - "version": "https://github.com/Cysharp/RuntimeUnitTestToolkit.git?path=RuntimeUnitTestToolkit/Assets/RuntimeUnitTestToolkit", - "depth": 0, - "source": "git", - "dependencies": {}, - "hash": "1a9d2bee8d37f8e5317b7efe91e70c977c679fd6" - }, - "com.unity.ai.navigation": { - "version": "1.1.4", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.modules.ai": "1.0.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.ext.nunit": { "version": "1.0.6", "depth": 1, @@ -61,12 +45,6 @@ "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.ai": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", - "dependencies": {} - }, "com.unity.modules.animation": { "version": "1.0.0", "depth": 0, @@ -131,6 +109,17 @@ "version": "1.0.0", "depth": 0, "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", diff --git a/VContainer/ProjectSettings/ProjectVersion.txt b/VContainer/ProjectSettings/ProjectVersion.txt index 0a60761e..cd32c298 100644 --- a/VContainer/ProjectSettings/ProjectVersion.txt +++ b/VContainer/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.5f1 -m_EditorVersionWithRevision: 2022.3.5f1 (9674261d40ee) +m_EditorVersion: 2021.3.30f1 +m_EditorVersionWithRevision: 2021.3.30f1 (b4360d7cdac4)