Skip to content

Commit b0c6918

Browse files
committed
Working on 5.11.0
1 parent 0eead35 commit b0c6918

26 files changed

+877
-781
lines changed

package.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<Project>
22

33
<PropertyGroup>
4-
<VersionBase>5.10.3</VersionBase>
4+
<VersionBase>5.11.0</VersionBase>
55
<PackageReleaseNotes>This package is compatible with .NET Standard 1.0 and 2.0, .NET Core 1.0 and 2.0, .NET 4.0, 4.5, 4.6, 4.7</PackageReleaseNotes>
66
</PropertyGroup>
77

88
<PropertyGroup>
9-
<UnityAbstractionsVersion>4.1.*</UnityAbstractionsVersion>
9+
<UnityAbstractionsVersion>5.11.*</UnityAbstractionsVersion>
1010
<TargetFrameworks>netstandard2.0;netstandard1.0;netcoreapp2.0;netcoreapp1.0;net47;net46;net45;net40</TargetFrameworks>
1111
</PropertyGroup>
1212

src/Extensions/DefaultLifetime.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using Unity.Extension;
3+
using Unity.Lifetime;
4+
5+
namespace Unity
6+
{
7+
public class DefaultLifetime : UnityContainerExtension
8+
{
9+
protected override void Initialize()
10+
{
11+
}
12+
13+
#region Public Members
14+
15+
public ITypeLifetimeManager TypeDefaultLifetime
16+
{
17+
get => (ITypeLifetimeManager)((UnityContainer)Container).TypeLifetimeManager;
18+
set => ((UnityContainer)Container).TypeLifetimeManager = (LifetimeManager)value ??
19+
throw new ArgumentNullException("Type Lifetime Manager can not be null");
20+
}
21+
22+
public IInstanceLifetimeManager InstanceDefaultLifetime
23+
{
24+
get => (IInstanceLifetimeManager)((UnityContainer)Container).InstanceLifetimeManager;
25+
set => ((UnityContainer)Container).InstanceLifetimeManager = (LifetimeManager)value ??
26+
throw new ArgumentNullException("Instance Lifetime Manager can not be null");
27+
}
28+
29+
public IFactoryLifetimeManager FactoryDefaultLifetime
30+
{
31+
get => (IFactoryLifetimeManager)((UnityContainer)Container).FactoryLifetimeManager;
32+
set => ((UnityContainer)Container).FactoryLifetimeManager = (LifetimeManager)value ??
33+
throw new ArgumentNullException("Factory Lifetime Manager can not be null");
34+
}
35+
36+
#endregion
37+
}
38+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System;
2+
using System.Linq;
3+
using System.Reflection;
4+
using Unity.Builder;
5+
using Unity.Policy;
6+
using Unity.Resolution;
7+
8+
namespace Unity.Factories
9+
{
10+
public class EnumerableResolver
11+
{
12+
#region Fields
13+
14+
private static readonly MethodInfo EnumerableMethod =
15+
typeof(EnumerableResolver).GetTypeInfo()
16+
.GetDeclaredMethod(nameof(EnumerableResolver.Resolver));
17+
18+
private static readonly MethodInfo EnumerableFactory =
19+
typeof(EnumerableResolver).GetTypeInfo()
20+
.GetDeclaredMethod(nameof(EnumerableResolver.ResolverFactory));
21+
22+
#endregion
23+
24+
25+
#region ResolveDelegateFactory
26+
27+
public static ResolveDelegateFactory Factory = (ref BuilderContext context) =>
28+
{
29+
30+
#if NETSTANDARD1_0 || NETCOREAPP1_0 || NET40
31+
var typeArgument = context.Type.GetTypeInfo().GenericTypeArguments.First();
32+
if (typeArgument.GetTypeInfo().IsGenericType)
33+
#else
34+
var typeArgument = context.Type.GenericTypeArguments.First();
35+
if (typeArgument.IsGenericType)
36+
#endif
37+
{
38+
return ((EnumerableFactoryDelegate)
39+
EnumerableFactory.MakeGenericMethod(typeArgument)
40+
.CreateDelegate(typeof(EnumerableFactoryDelegate)))();
41+
}
42+
else
43+
{
44+
return (ResolveDelegate<BuilderContext>)
45+
EnumerableMethod.MakeGenericMethod(typeArgument)
46+
.CreateDelegate(typeof(ResolveDelegate<BuilderContext>));
47+
}
48+
};
49+
50+
#endregion
51+
52+
53+
#region Implementation
54+
55+
private static object Resolver<TElement>(ref BuilderContext context)
56+
{
57+
return ((UnityContainer)context.Container).ResolveEnumerable<TElement>(context.Resolve,
58+
context.Name);
59+
}
60+
61+
private static ResolveDelegate<BuilderContext> ResolverFactory<TElement>()
62+
{
63+
Type type = typeof(TElement).GetGenericTypeDefinition();
64+
return (ref BuilderContext c) => ((UnityContainer)c.Container).ResolveEnumerable<TElement>(c.Resolve, type, c.Name);
65+
}
66+
67+
#endregion
68+
69+
70+
#region Nested Types
71+
72+
private delegate ResolveDelegate<BuilderContext> EnumerableFactoryDelegate();
73+
74+
#endregion
75+
}
76+
}

src/Lifetime/ContainerLifetimeManager.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,7 @@ protected override LifetimeManager OnCreateLifetimeManager()
1919
{
2020
return new ContainerLifetimeManager();
2121
}
22+
23+
public override bool InUse { get => false; set => base.InUse = false; }
2224
}
2325
}

src/Storage/QuickSet.cs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using System;
2+
using System.Security;
3+
4+
namespace Unity.Storage
5+
{
6+
[SecuritySafeCritical]
7+
public class QuickSet<TValue>
8+
{
9+
#region Fields
10+
11+
private int _prime;
12+
private int[] Buckets;
13+
private Entry[] Entries;
14+
public int Count { get; private set; }
15+
16+
#endregion
17+
18+
19+
#region Constructors
20+
21+
public QuickSet()
22+
{
23+
var size = Primes[_prime];
24+
Buckets = new int[size];
25+
Entries = new Entry[size];
26+
27+
#if !NET40
28+
unsafe
29+
{
30+
fixed (int* bucketsPtr = Buckets)
31+
{
32+
int* ptr = bucketsPtr;
33+
var end = bucketsPtr + Buckets.Length;
34+
while (ptr < end) *ptr++ = -1;
35+
}
36+
}
37+
#else
38+
for(int i = 0; i < Buckets.Length; i++)
39+
Buckets[i] = -1;
40+
#endif
41+
}
42+
43+
#endregion
44+
45+
46+
#region Public Methods
47+
48+
public bool Add(int hashCode, TValue value)
49+
{
50+
var collisions = 0;
51+
var targetBucket = (hashCode & UnityContainer.HashMask) % Buckets.Length;
52+
53+
// Check for the existing
54+
for (var i = Buckets[targetBucket]; i >= 0; i = Entries[i].Next)
55+
{
56+
ref var candidate = ref Entries[i];
57+
if (candidate.HashCode != hashCode || !Equals(candidate.Value, value))
58+
{
59+
collisions++;
60+
continue;
61+
}
62+
63+
// Already exists
64+
return false;
65+
}
66+
67+
// Expand if required
68+
if (Count >= Entries.Length || 3 < collisions)
69+
{
70+
Expand();
71+
targetBucket = (hashCode & UnityContainer.HashMask) % Buckets.Length;
72+
}
73+
74+
// Add registration
75+
ref var entry = ref Entries[Count];
76+
entry.HashCode = hashCode;
77+
entry.Value = value;
78+
entry.Next = Buckets[targetBucket];
79+
Buckets[targetBucket] = Count++;
80+
81+
return true;
82+
}
83+
84+
#endregion
85+
86+
87+
#region Entry Type
88+
89+
private struct Entry
90+
{
91+
public int HashCode;
92+
public TValue Value;
93+
public int Next;
94+
}
95+
96+
#endregion
97+
98+
99+
#region Implementation
100+
101+
private void Expand()
102+
{
103+
var entries = Entries;
104+
105+
_prime += 1;
106+
107+
var size = Primes[_prime];
108+
Buckets = new int[size];
109+
Entries = new Entry[size];
110+
111+
#if !NET40
112+
unsafe
113+
{
114+
fixed (int* bucketsPtr = Buckets)
115+
{
116+
int* ptr = bucketsPtr;
117+
var end = bucketsPtr + Buckets.Length;
118+
while (ptr < end) *ptr++ = -1;
119+
}
120+
}
121+
#else
122+
for(int i = 0; i < Buckets.Length; i++)
123+
Buckets[i] = -1;
124+
#endif
125+
Array.Copy(entries, 0, Entries, 0, Count);
126+
for (var i = 0; i < Count; i++)
127+
{
128+
var hashCode = Entries[i].HashCode & UnityContainer.HashMask;
129+
if (hashCode < 0) continue;
130+
131+
var bucket = hashCode % Buckets.Length;
132+
Entries[i].Next = Buckets[bucket];
133+
Buckets[bucket] = i;
134+
}
135+
}
136+
137+
public static readonly int[] Primes = {
138+
11, 37, 71, 107, 131, 163, 197, 239, 293, 353, 431, 521, 631, 761, 919, 1103, 1327, 1597,
139+
1931, 2333, 2801, 3371, 4049, 4861, 5839, 7013, 8419, 10103, 12143, 14591, 17519, 21023,
140+
25229, 30293, 36353, 43627, 52361, 62851, 75431, 90523, 108631, 130363, 156437, 187751,
141+
225307, 270371, 324449, 389357, 467237, 560689, 672827, 807403, 968897, 1162687, 1395263,
142+
1674319, 2009191, 2411033, 2893249, 3471899, 4166287, 4999559, 5999471, 7199369};
143+
144+
#endregion
145+
}
146+
}

src/Strategies/BuildPlanStrategy.cs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,33 @@ protected static TPolicyInterface Get_Policy<TPolicyInterface>(ref BuilderContex
9696

9797
protected static object GetGeneric(ref BuilderContext context, Type policyInterface)
9898
{
99-
// Check if generic
99+
if (context.Registration is ContainerRegistration registration && null != context.Type)
100+
{
101+
// Check if generic
100102
#if NETCOREAPP1_0 || NETSTANDARD1_0
101-
if (context.RegistrationType.GetTypeInfo().IsGenericType)
103+
if (context.Type.GetTypeInfo().IsGenericType)
102104
#else
103-
if (context.RegistrationType.IsGenericType)
105+
if (context.Type.IsGenericType)
104106
#endif
107+
{
108+
var newType = context.Type.GetGenericTypeDefinition();
109+
return context.Get(newType, context.Name, policyInterface) ??
110+
context.Get(newType, UnityContainer.All, policyInterface);
111+
}
112+
}
113+
else
105114
{
106-
var newType = context.RegistrationType.GetGenericTypeDefinition();
107-
return context.Get(newType, context.Name, policyInterface) ??
108-
context.Get(newType, UnityContainer.All, policyInterface);
115+
// Check if generic
116+
#if NETCOREAPP1_0 || NETSTANDARD1_0
117+
if (context.RegistrationType.GetTypeInfo().IsGenericType)
118+
#else
119+
if (context.RegistrationType.IsGenericType)
120+
#endif
121+
{
122+
var newType = context.RegistrationType.GetGenericTypeDefinition();
123+
return context.Get(newType, context.Name, policyInterface) ??
124+
context.Get(newType, UnityContainer.All, policyInterface);
125+
}
109126
}
110127

111128
return null;

0 commit comments

Comments
 (0)