Skip to content

Commit cc01a06

Browse files
authored
Merge pull request #4 from CrackAndDie/dev
New container implementation and more
2 parents eedee08 + f7c2919 commit cc01a06

File tree

82 files changed

+1869
-472
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+1869
-472
lines changed

Hypocrite.Avalonia/Container/LightContainerExtension.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ public void FinalizeExtension()
5656

5757
public Type GetRegistrationType(string key)
5858
{
59-
return Instance.Registrations.FirstOrDefault(x => x.Name == key)?.GetType();
59+
return Instance.Registrations.Get(0, key)?.Value?.MappedToType;
6060
}
6161

6262
public Type GetRegistrationType(Type serviceType)
6363
{
64-
var matchingRegistration = Instance.Registrations.Where(x => x.RegisteredType == serviceType).FirstOrDefault();
65-
return matchingRegistration?.MappedToType;
64+
var matchingRegistration = Instance.Registrations.Get(serviceType.GetHashCode(), string.Empty);
65+
return matchingRegistration?.Value?.MappedToType;
6666
}
6767

6868
public bool IsRegistered(Type type)

Hypocrite.Avalonia/Localization/LocalizationChangedObservable.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using Hypocrite.Core.Mvvm;
2-
using Hypocrite.Core.Mvvm.ObserverLogics;
32
using Avalonia;
43
using Avalonia.Data;
54
using System;
65
using System.ComponentModel;
76
using System.Reflection;
7+
using Hypocrite.Core.Reactive;
88

99
namespace Hypocrite.Localization
1010
{

Hypocrite.Avalonia/MVVM/ApplicationBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Hypocrite.Core.Container;
44
using Hypocrite.Core.Interfaces;
55
using Hypocrite.Core.Interfaces.Presentation;
6-
using Hypocrite.Core.Mvvm.Events;
76
using Hypocrite.Core.Services;
87
using Hypocrite.Core.Logging.Interfaces;
98
using Hypocrite.Core.Logging.Services;
@@ -22,6 +21,7 @@
2221
using Prism.Services.Dialogs;
2322
using Prism;
2423
using Hypocrite.Container;
24+
using Hypocrite.Core.Events;
2525

2626
namespace Hypocrite.Mvvm
2727
{

Hypocrite.Avalonia/MVVM/DialogViewModelBase.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
using Avalonia.Input;
2-
using Hypocrite.Core.Mvvm.Events;
3-
using Prism.Commands;
2+
using Hypocrite.Core.Events;
43
using Prism.Services.Dialogs;
54
using System;
6-
using System.Collections.Generic;
7-
using System.Text;
8-
using System.Windows.Input;
95

106
namespace Hypocrite.Mvvm
117
{

Hypocrite.Avalonia/MVVM/ViewModelBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Hypocrite.Mvvm
99
{
10-
public class ViewModelBase : EngineViewModelBase, INavigationAware
10+
public class ViewModelBase : CoreViewModelBase, INavigationAware
1111
{
1212
public ViewModelBase()
1313
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Hypocrite.Benchmarks.Container
2+
{
3+
public class ContainerTestClass
4+
{
5+
public int Id { get; set; }
6+
public string Name { get; set; }
7+
8+
public ContainerTestClass(int id, string name)
9+
{
10+
Id = id;
11+
Name = name;
12+
}
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Hypocrite.Benchmarks.Container
2+
{
3+
public class ContainerTestClass2
4+
{
5+
public int Id { get; set; }
6+
public string Name { get; set; }
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Hypocrite.Core.Container;
2+
using Unity;
3+
4+
namespace Hypocrite.Benchmarks.Container
5+
{
6+
public class ContainerTestClass3Light
7+
{
8+
public int Id { get; set; }
9+
public string Name { get; set; }
10+
[Injection]
11+
public ContainerTestClass2 TestClass { get; set; }
12+
}
13+
14+
public class ContainerTestClass3Unity
15+
{
16+
public int Id { get; set; }
17+
public string Name { get; set; }
18+
[Dependency]
19+
public ContainerTestClass2 TestClass { get; set; }
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Hypocrite.Core.Container;
2+
using Unity;
3+
4+
namespace Hypocrite.Benchmarks.Container
5+
{
6+
public class ContainerTestClass4Light
7+
{
8+
public int Id { get; set; }
9+
public string Name { get; set; }
10+
public ContainerTestClass2 TestClass { get; set; }
11+
12+
public ContainerTestClass4Light([Injection] ContainerTestClass2 testClass)
13+
{
14+
TestClass = testClass;
15+
}
16+
}
17+
18+
public class ContainerTestClass4Unity
19+
{
20+
public int Id { get; set; }
21+
public string Name { get; set; }
22+
public ContainerTestClass2 TestClass { get; set; }
23+
24+
public ContainerTestClass4Unity([Dependency] ContainerTestClass2 testClass)
25+
{
26+
TestClass = testClass;
27+
}
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Interfaces;
4+
using Unity;
5+
6+
namespace Hypocrite.Benchmarks.Container
7+
{
8+
[MemoryDiagnoser]
9+
public class IsRegistered
10+
{
11+
ILightContainer _lightContainer;
12+
IUnityContainer _unityContainer;
13+
14+
public IsRegistered()
15+
{
16+
_lightContainer = new LightContainer();
17+
_lightContainer.RegisterType(typeof(ContainerTestClass2), typeof(ContainerTestClass2));
18+
_unityContainer = new UnityContainer();
19+
_unityContainer.RegisterType<ContainerTestClass2>();
20+
}
21+
22+
[Benchmark]
23+
public bool WithUnityContainer()
24+
{
25+
return _unityContainer.IsRegistered<ContainerTestClass2>();
26+
}
27+
28+
[Benchmark]
29+
public bool WithLightContainer()
30+
{
31+
return _lightContainer.IsRegistered(typeof(ContainerTestClass2));
32+
}
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Extensions;
4+
5+
namespace Hypocrite.Benchmarks.Container
6+
{
7+
[MemoryDiagnoser]
8+
public class LightContainerSteps
9+
{
10+
LightContainer _lightContainer;
11+
12+
public LightContainerSteps()
13+
{
14+
_lightContainer = new LightContainer();
15+
_lightContainer.RegisterType(typeof(ContainerTestClass2), typeof(ContainerTestClass2), false);
16+
}
17+
18+
[Benchmark]
19+
public void IsRegistered()
20+
{
21+
_lightContainer.IsRegistered(typeof(ContainerTestClass2));
22+
}
23+
24+
[Benchmark]
25+
public void GetRegistration()
26+
{
27+
_lightContainer.GetRegistration(typeof(ContainerTestClass2), string.Empty);
28+
}
29+
30+
// it takes about 60ns
31+
// var _ = reg.RegistrationPolicy.CreateInstance(true);
32+
33+
[Benchmark]
34+
public void CreatePureInstance()
35+
{
36+
var reg = _lightContainer.GetRegistration(typeof(ContainerTestClass2), string.Empty);
37+
var _ = _lightContainer.InstanceCreator.CreatePureInstance(reg);
38+
}
39+
40+
[Benchmark]
41+
public void CreateInstance()
42+
{
43+
var reg = _lightContainer.GetRegistration(typeof(ContainerTestClass2), string.Empty);
44+
var inst = _lightContainer.InstanceCreator.CreatePureInstance(reg);
45+
_lightContainer.InstanceCreator.ResolveInjections(inst, reg.MemberInjectionInfo);
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Interfaces;
4+
using Hypocrite.Core.Container.Extensions;
5+
using Unity;
6+
using System.Collections.Generic;
7+
8+
namespace Hypocrite.Benchmarks.Container
9+
{
10+
[MemoryDiagnoser]
11+
public class ResolveOverloadType
12+
{
13+
ILightContainer _lightContainer;
14+
IUnityContainer _unityContainer;
15+
16+
public ResolveOverloadType()
17+
{
18+
_lightContainer = new LightContainer();
19+
_unityContainer = new UnityContainer();
20+
21+
for (char c = 'A'; c <= 'Z'; ++c)
22+
{
23+
_lightContainer.RegisterType<ContainerTestClass2>(c.ToString());
24+
_unityContainer.RegisterType<ContainerTestClass2>(c.ToString());
25+
}
26+
}
27+
28+
[Benchmark]
29+
public ContainerTestClass2 WithUnityContainer()
30+
{
31+
return _unityContainer.Resolve<ContainerTestClass2>("K");
32+
}
33+
34+
[Benchmark]
35+
public ContainerTestClass2 WithLightContainer()
36+
{
37+
return _lightContainer.Resolve<ContainerTestClass2>("K");
38+
}
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Interfaces;
4+
using System.Linq.Expressions;
5+
using Unity;
6+
7+
namespace Hypocrite.Benchmarks.Container
8+
{
9+
[MemoryDiagnoser]
10+
public class ResolveSingleton
11+
{
12+
ILightContainer _lightContainer;
13+
IUnityContainer _unityContainer;
14+
15+
public ResolveSingleton()
16+
{
17+
_lightContainer = new LightContainer();
18+
_lightContainer.RegisterType(typeof(ContainerTestClass2), typeof(ContainerTestClass2), true);
19+
_unityContainer = new UnityContainer();
20+
_unityContainer.RegisterSingleton<ContainerTestClass2>();
21+
}
22+
23+
[Benchmark]
24+
public ContainerTestClass2 WithUnityContainer()
25+
{
26+
return _unityContainer.Resolve<ContainerTestClass2>();
27+
}
28+
29+
[Benchmark]
30+
public ContainerTestClass2 WithLightContainer()
31+
{
32+
return _lightContainer.Resolve(typeof(ContainerTestClass2)) as ContainerTestClass2;
33+
}
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Interfaces;
4+
using Unity;
5+
6+
namespace Hypocrite.Benchmarks.Container
7+
{
8+
[MemoryDiagnoser]
9+
public class ResolveType
10+
{
11+
ILightContainer _lightContainer;
12+
IUnityContainer _unityContainer;
13+
14+
public ResolveType()
15+
{
16+
_lightContainer = new LightContainer();
17+
_lightContainer.RegisterType(typeof(ContainerTestClass2), typeof(ContainerTestClass2));
18+
_unityContainer = new UnityContainer();
19+
_unityContainer.RegisterType<ContainerTestClass2>();
20+
}
21+
22+
[Benchmark]
23+
public ContainerTestClass2 WithUnityContainer()
24+
{
25+
return _unityContainer.Resolve<ContainerTestClass2>();
26+
}
27+
28+
[Benchmark]
29+
public ContainerTestClass2 WithLightContainer()
30+
{
31+
return _lightContainer.Resolve(typeof(ContainerTestClass2)) as ContainerTestClass2;
32+
}
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Hypocrite.Core.Container;
3+
using Hypocrite.Core.Container.Interfaces;
4+
using Unity;
5+
6+
namespace Hypocrite.Benchmarks.Container
7+
{
8+
[MemoryDiagnoser]
9+
public class ResolveTypeWithCtorInjection
10+
{
11+
ILightContainer _lightContainer;
12+
IUnityContainer _unityContainer;
13+
14+
public ResolveTypeWithCtorInjection()
15+
{
16+
_lightContainer = new LightContainer();
17+
_lightContainer.RegisterType(typeof(ContainerTestClass2), typeof(ContainerTestClass2));
18+
_lightContainer.RegisterType(typeof(ContainerTestClass4Light), typeof(ContainerTestClass4Light));
19+
_unityContainer = new UnityContainer();
20+
_unityContainer.RegisterType<ContainerTestClass2>();
21+
_unityContainer.RegisterType<ContainerTestClass4Unity>();
22+
}
23+
24+
[Benchmark]
25+
public int WithUnityContainer()
26+
{
27+
return _unityContainer.Resolve<ContainerTestClass4Unity>().TestClass.Id;
28+
}
29+
30+
[Benchmark]
31+
public int WithLightContainer()
32+
{
33+
return (_lightContainer.Resolve(typeof(ContainerTestClass4Light)) as ContainerTestClass4Light).TestClass.Id;
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)