##// END OF EJS Templates
Added tests for Implab.ServiceHost.Unity configuration loader.
cin -
r289:95896f882995 v3.0.14 v3
parent child
Show More
@@ -0,0 +1,29
1 <Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup Condition="'$(OSTYPE)'=='linux'">
3 <TargetFrameworks>netcoreapp2.0;net46</TargetFrameworks>
4 <FrameworkPathOverride Condition="'$(TargetFramework)'=='net46'">/usr/lib/mono/4.5/</FrameworkPathOverride>
5 </PropertyGroup>
6
7 <PropertyGroup Condition="'$(OSTYPE)'=='windows'">
8 <TargetFrameworks>netcoreapp2.0;net46</TargetFrameworks>
9 </PropertyGroup>
10
11 <PropertyGroup>
12 <IsPackable>false</IsPackable>
13 </PropertyGroup>
14
15 <ItemGroup>
16 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0-preview-20180109-01" />
17 <PackageReference Include="System.Reactive" Version="4.0.0" />
18 <PackageReference Include="xunit" Version="2.3.1" />
19 <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
20 <ProjectReference Include="../Implab/Implab.csproj"/>
21 <ProjectReference Include="../Implab.ServiceHost/Implab.ServiceHost.csproj"/>
22 <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <None Include="data/**/*.*" CopyToOutputDirectory="PreserveNewest" />
27 </ItemGroup>
28
29 </Project>
@@ -0,0 +1,74
1 <?xml version="1.0" encoding="UTF-8"?>
2 <container xmlns="http://implab.org/schemas/servicehost/unity.v1.xsd">
3 <namespace name="System"/>
4 <namespace name="System.Collections.Generic"/>
5 <namespace name="Implab.Components"/>
6 <namespace name="Implab.ServiceHost.Test.Mock"/>
7
8 <!-- Default FooService -->
9 <register type="FooService{}">
10 <property name="Name">
11 <value>I'm default!</value>
12 </property>
13 </register>
14
15 <!-- foo2 -->
16 <register name="foo2" type="Foo">
17 <property name="Name">
18 <value>GOOD</value>
19 </property>
20 <property name="IntValue">
21 <value>2</value>
22 </property>
23 </register>
24
25 <register type="Foo">
26 <method name="AddRange">
27 <array itemsType="Foo">
28 <dependency name="foo2"/>
29 </array>
30 </method>
31 </register>
32
33 <register type="IContainer{}" mapTo="Container{}">
34 <constructor/>
35 <method name="SetInstance">
36 <dependency type="T"/>
37 </method>
38 <method name="AddRange">
39 <array itemsType="T">
40 <dependency name="foo2-bar"/>
41 </array>
42 </method>
43 </register>
44
45 <register type="List{}">
46 <constructor />
47 </register>
48
49 <register type="IContainer{String}" mapTo="Container{String}">
50 <constructor/>
51 <method name="SetInstance">
52 <dependency type="String" name="name1"/>
53 </method>
54 </register>
55
56 <serialized type="Foo+Bar">
57 <Bar xmlns="" id="1">
58 <Name>Baaar</Name>
59 </Bar>
60 </serialized>
61
62 <value name="connection1" type="String"><![CDATA[Connect me <here>!]]></value>
63 <value name="name1" type="String" value="Hello!"/>
64
65 <factory name="foo3" type="IFactory{Foo}" mapTo="FooFactory">
66 <property name="Connection">
67 <value><![CDATA[Wired "" objecty <> name @#$%^&]]></value>
68 </property>
69 <property name="UseSsl">
70 <value>false</value>
71 </property>
72 </factory>
73
74 </container> No newline at end of file
@@ -0,0 +1,2
1 <container xmlns="http://implab.org/schemas/servicehost/unity.v1.xsd">
2 </container> No newline at end of file
@@ -0,0 +1,65
1 <?xml version="1.0"?>
2 <container xmlns="http://implab.org/schemas/servicehost/unity.v1.xsd">
3 <namespace name="System"/>
4 <namespace name="System.Collections.Generic"/>
5 <namespace name="Implab.Components"/>
6 <namespace name="Implab.ServiceHost.Test.Mock"/>
7
8 <register name="Big" type="Baz+Nut">
9 <property name="Size">
10 <value>5</value>
11 </property>
12 </register>
13 <register name="Mid" type="Baz+Nut">
14 <property name="Size">
15 <value>3</value>
16 </property>
17 </register>
18 <register name="Small" type="Baz+Nut">
19 <property name="Size">
20 <value>1</value>
21 </property>
22 </register>
23 <register type="Baz+Nut">
24 <property name="Size">
25 <value>2</value>
26 </property>
27 </register>
28
29 <!-- register a generic interface mapping to the generic type -->
30 <register type="IBox{}" mapTo="Box{}">
31 <property name="Value">
32 <!-- the dependency type is implied from the property and will be the generic parameter {T} -->
33 <dependency optional="true"/>
34 </property>
35 </register>
36
37 <factory name="Box2" type="BoxFactory{}">
38 </factory>
39
40 <register type="IBox{String}" mapTo="Box{String}">
41 <property name="Name">
42 <value>boxForString</value>
43 </property>
44 </register>
45
46 <register name="Small" type="IBox{}" mapTo="Box{}">
47 <property name="Value">
48 <dependency name="Small" optional="true"/>
49 </property>
50 </register>
51
52 <register type="SetOfBoxes{}">
53 <constructor/>
54 <method name="BoxValues">
55 <!-- only generic parameter or type without unresolved parameters
56 can be used, this is a limitation of Unity container. TODO -->
57 <array itemsType="T">
58 <default />
59 <dependency optional="true"/>
60 <dependency name="Small" optional="true"/>
61 </array>
62 </method>
63 </register>
64
65 </container> No newline at end of file
@@ -0,0 +1,6
1 <?xml version="1.0"?>
2 <Person xmlns="urn:implab:test:model">
3 <FirstName>Trohn</FirstName>
4 <LastName>Javolta</LastName>
5 <Age>88</Age>
6 </Person> No newline at end of file
@@ -0,0 +1,16
1 <?xml version="1.0"?>
2 <container xmlns="http://implab.org/schemas/servicehost/unity.v1.xsd">
3 <namespace name="System"/>
4 <namespace name="System.Collections.Generic"/>
5 <namespace name="Implab.Components"/>
6 <namespace name="Implab.ServiceHost.Test.Mock"/>
7
8 <serialized name="p1" type="Person">
9 <Person xmlns="urn:implab:test:model">
10 <FirstName>Com</FirstName>
11 <LastName>Truise</LastName>
12 <Age>99</Age>
13 </Person>
14 </serialized>
15 <serialized name="p2" type="Person" href="p2.xml"/>
16 </container> No newline at end of file
@@ -0,0 +1,63
1 <?xml version="1.0"?>
2 <container xmlns="http://implab.org/schemas/servicehost/unity.v1.xsd">
3 <namespace name="System"/>
4 <namespace name="System.Collections.Generic"/>
5 <namespace name="Implab.Components"/>
6 <namespace name="Implab.ServiceHost.Test.Mock"/>
7
8 <register name="Baz1" type="Baz">
9 <property name="Numbers">
10 <array>
11 <value>1</value>
12 <value>2</value>
13 <value>3</value>
14 </array>
15 </property>
16 </register>
17
18 <register type="Baz">
19 <property name="Nuts">
20 <array>
21 <dependency/>
22 <dependency name="Big"/>
23 <dependency name="Big"/>
24 <dependency name="Small"/>
25 <dependency name="Mid"/>
26 </array>
27 </property>
28 </register>
29
30 <register name="Big" type="Baz+Nut">
31 <property name="Size">
32 <value>5</value>
33 </property>
34 </register>
35 <register name="Mid" type="Baz+Nut">
36 <property name="Size">
37 <value>3</value>
38 </property>
39 </register>
40 <register name="Small" type="Baz+Nut">
41 <property name="Size">
42 <value>1</value>
43 </property>
44 </register>
45 <register type="Baz+Nut">
46 <property name="Size">
47 <value>2</value>
48 </property>
49 </register>
50 <factory type="BazFactory">
51 <provides name="Baz2" type="Baz"/>
52 </factory>
53
54 <factory name="Baz3" type="BazFactory">
55 <property name="IdGenerator">
56 <dependency/>
57 </property>
58 </factory>
59
60 <factory type="GuidFactory">
61 <singleton/>
62 </factory>
63 </container> No newline at end of file
@@ -0,0 +1,23
1 using System;
2 using System.Collections.Generic;
3
4 namespace Implab.ServiceHost.Test.Mock {
5 public class Baz {
6
7 public Guid Id {
8 get; set;
9 }
10
11 public int[] Numbers {
12 get; set;
13 }
14
15 public Nut[] Nuts {
16 get; set;
17 }
18
19 public class Nut {
20 public int Size { get; set; }
21 }
22 }
23 } No newline at end of file
@@ -0,0 +1,17
1 using System;
2 using Implab.Components;
3
4 namespace Implab.ServiceHost.Test.Mock {
5 public class BazFactory : IFactory<Baz> {
6
7 public Func<Guid> IdGenerator {
8 get; set;
9 }
10
11 Baz IFactory<Baz>.Create() {
12 return new Baz {
13 Id = IdGenerator?.Invoke() ?? Guid.Empty
14 };
15 }
16 }
17 } No newline at end of file
@@ -0,0 +1,13
1 using System;
2 using Implab.Components;
3
4 namespace Implab.ServiceHost.Test.Mock {
5 public class BoxFactory<T> : IFactory<IBox<T>> {
6 public IBox<T> Create() {
7 return new Box<T> {
8 Name = "Creepy sugar"
9 };
10 }
11 }
12
13 } No newline at end of file
@@ -0,0 +1,13
1 namespace Implab.ServiceHost.Test.Mock {
2 public class Box<T> : IBox<T> {
3
4 public string Name { get; set; }
5
6 public T Value { get; set; }
7
8 public T GetBoxValue() {
9 return Value;
10 }
11
12 }
13 } No newline at end of file
@@ -0,0 +1,10
1 using System;
2 using Implab.Components;
3
4 namespace Implab.ServiceHost.Test.Mock {
5 public class GuidFactory : IFactory<Guid> {
6 public Guid Create() {
7 return Guid.NewGuid();
8 }
9 }
10 } No newline at end of file
@@ -0,0 +1,6
1 namespace Implab.ServiceHost.Test.Mock {
2 public interface IBox<T> {
3 string Name { get; }
4 T GetBoxValue();
5 }
6 } No newline at end of file
@@ -0,0 +1,20
1 using System.Xml.Serialization;
2
3 namespace Implab.ServiceHost.Test.Mock
4 {
5 [XmlRoot(Namespace="urn:implab:test:model")]
6 public class Person {
7 public string FirstName { get; set; }
8
9 public string LastName { get; set; }
10
11 public int Age { get; set; }
12
13 [XmlIgnore]
14 public bool AgeSpecified { get; set; }
15
16
17 [XmlElement("Tag")]
18 public string[] Tags { get; set; }
19 }
20 } No newline at end of file
@@ -0,0 +1,21
1 using System;
2 using System.Linq;
3
4 namespace Implab.ServiceHost.Test.Mock {
5 public class SetOfBoxes<T> {
6
7 public Guid Uuid { get; set; }
8
9 public IBox<T>[] Boxes {
10 get; set;
11 }
12
13 public void BoxValues(T[] items) {
14 if (items == null || items.Length == 0)
15 return;
16
17 Boxes = items.Select(x => new Box<T> {Value = x}).ToArray();
18 }
19
20 }
21 } No newline at end of file
@@ -0,0 +1,94
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Threading;
6 using System.Threading.Tasks;
7 using Implab.Components;
8 using Implab.Diagnostics;
9 using Implab.ServiceHost.Test.Mock;
10 using Implab.ServiceHost.Unity;
11 using Unity;
12 using Xunit;
13
14 namespace Implab.Test {
15
16 public class UnityConfigTest {
17
18 [Fact]
19 public void CreateContainer() {
20 var container = new UnityContainer();
21
22 container.LoadXmlConfiguration(Path.Combine("data","container","empty.xml"));
23 }
24
25 [Fact]
26 public void SimpleServicesContainer() {
27 var container = new UnityContainer();
28
29 container.LoadXmlConfiguration(Path.Combine("data","container","simple.services.xml"));
30
31 // named service registration
32 var baz1 = container.Resolve<Baz>("Baz1");
33
34 Assert.Equal(new [] {1,2,3}, baz1.Numbers);
35
36 // default service registration
37 var baz = container.Resolve<Baz>();
38
39 Assert.Equal(new [] {2,5,5,1,3}, baz.Nuts.Select(x => x.Size));
40
41 // ServiceFactory registered without a name
42 // explicitly provides 'Baz2' service
43 var baz2 = container.Resolve<Baz>("Baz2");
44
45 // ServiceFactory registered with name 'Baz3'
46 // provides by default the service registration with same name
47 var baz3 = container.Resolve<Baz>("Baz3");
48
49 // This factory uses GuidGenerator registration
50 // to generate a new id value
51 Assert.NotEqual(Guid.Empty, baz3.Id);
52 }
53
54 [Fact]
55 public void GenericServicesContainer() {
56 var container = new UnityContainer();
57 container.LoadXmlConfiguration(Path.Combine("data","container","generic.services.xml"));
58
59 // resolve using a generig interface mapping
60 var box = container.Resolve<IBox<Baz.Nut>>();
61
62 Assert.NotNull(box.GetBoxValue());
63
64 // registered generic defines dependency of type {T}
65 // in this case it should resolve to the default Nut with Size=2
66 Assert.Equal(box.GetBoxValue().Size,2);
67
68 // generic factory which provides generic services
69 var box2 = container.Resolve<IBox<Baz.Nut>>();
70
71 var set1 = container.Resolve<SetOfBoxes<Baz.Nut>>();
72
73 Assert.Equal(new int?[] {null,2,1}, set1.Boxes?.Select(x => x.GetBoxValue()?.Size));
74 }
75
76 [Fact]
77 public void SerializedInstances() {
78 var container = new UnityContainer();
79 container.LoadXmlConfiguration(Path.Combine("data","container","serialized.instances.xml"));
80
81 var p1 = container.Resolve<Person>("p1");
82 var p2 = container.Resolve<Person>("p2");
83
84 Assert.Equal("Com", p1.FirstName);
85 Assert.True(p1.AgeSpecified);
86 Assert.Equal(99, p1.Age);
87
88 Assert.Equal("Javolta", p2.LastName);
89 Assert.True(p2.AgeSpecified);
90 Assert.Equal(88, p2.Age);
91 }
92
93 }
94 } No newline at end of file
@@ -1,27 +1,29
1 syntax: glob
1 syntax: glob
2 Implab.Test/bin/
2 Implab.Test/bin/
3 *.user
3 *.user
4 Implab.Test/obj/
4 Implab.Test/obj/
5 *.userprefs
5 *.userprefs
6 Implab/bin/
6 Implab/bin/
7 Implab/obj/
7 Implab/obj/
8 TestResults/
8 TestResults/
9 Implab.Fx/obj/
9 Implab.Fx/obj/
10 Implab.Fx/bin/
10 Implab.Fx/bin/
11 Implab.Fx.Test/bin/
11 Implab.Fx.Test/bin/
12 Implab.Fx.Test/obj/
12 Implab.Fx.Test/obj/
13 _ReSharper.Implab/
13 _ReSharper.Implab/
14 Implab.Diagnostics.Interactive/bin/
14 Implab.Diagnostics.Interactive/bin/
15 Implab.Diagnostics.Interactive/obj/
15 Implab.Diagnostics.Interactive/obj/
16 MonoPlay/bin/
16 MonoPlay/bin/
17 MonoPlay/obj/
17 MonoPlay/obj/
18 Implab.Test/Implab.Format.Test/bin/
18 Implab.Test/Implab.Format.Test/bin/
19 Implab.Test/Implab.Format.Test/obj/
19 Implab.Test/Implab.Format.Test/obj/
20 *.suo
20 *.suo
21 Implab.Format.Test/bin/
21 Implab.Format.Test/bin/
22 Implab.Format.Test/obj/
22 Implab.Format.Test/obj/
23 packages/
23 packages/
24 Implab.Playground/obj/
24 Implab.Playground/obj/
25 Implab.Playground/bin/
25 Implab.Playground/bin/
26 Implab.ServiceHost/bin/
26 Implab.ServiceHost/bin/
27 Implab.ServiceHost/obj/
27 Implab.ServiceHost/obj/
28 Implab.ServiceHost.Test/bin/
29 Implab.ServiceHost.Test/obj/
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractContainerItem.cs to Implab.ServiceHost/src/Unity/AbstractContainerItem.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractContainerItem.cs to Implab.ServiceHost/src/Unity/AbstractContainerItem.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractInjectionParameter.cs to Implab.ServiceHost/src/Unity/AbstractInjectionParameter.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractInjectionParameter.cs to Implab.ServiceHost/src/Unity/AbstractInjectionParameter.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractMemberInjection.cs to Implab.ServiceHost/src/Unity/AbstractMemberInjection.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractMemberInjection.cs to Implab.ServiceHost/src/Unity/AbstractMemberInjection.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractRegistration.cs to Implab.ServiceHost/src/Unity/AbstractRegistration.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/AbstractRegistration.cs to Implab.ServiceHost/src/Unity/AbstractRegistration.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ArrayParameterElement.cs to Implab.ServiceHost/src/Unity/ArrayParameterElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ArrayParameterElement.cs to Implab.ServiceHost/src/Unity/ArrayParameterElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ArrayTypeReference.cs to Implab.ServiceHost/src/Unity/ArrayTypeReference.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ArrayTypeReference.cs to Implab.ServiceHost/src/Unity/ArrayTypeReference.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/AssemblyElement.cs to Implab.ServiceHost/src/Unity/AssemblyElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/AssemblyElement.cs to Implab.ServiceHost/src/Unity/AssemblyElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ConstructorInjectionElement.cs to Implab.ServiceHost/src/Unity/ConstructorInjectionElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ConstructorInjectionElement.cs to Implab.ServiceHost/src/Unity/ConstructorInjectionElement.cs
@@ -1,145 +1,156
1 using System;
1 using System;
2 using System.IO;
2 using System.IO;
3 using System.Reflection;
3 using System.Reflection;
4 using Implab.Diagnostics;
4 using Implab.Diagnostics;
5 using Unity;
5 using Unity;
6
6
7 namespace Implab.ServiceHost.Unity {
7 namespace Implab.ServiceHost.Unity {
8 using Log = Trace<ContainerBuilder>;
8 using Log = Trace<ContainerBuilder>;
9
9
10 public class ContainerBuilder {
10 public class ContainerBuilder {
11
11
12 readonly TypeResolver m_resolver;
12 readonly TypeResolver m_resolver;
13
13
14 readonly IUnityContainer m_container;
14 readonly IUnityContainer m_container;
15
15
16 readonly ContainerConfigurationSchema m_schema;
16 readonly ContainerConfigurationSchema m_schema;
17
17
18 Uri m_location;
18 Uri m_location;
19
19
20 public IUnityContainer Container {
20 public IUnityContainer Container {
21 get {
21 get {
22 return m_container;
22 return m_container;
23 }
23 }
24 }
24 }
25
25
26 public ContainerBuilder() : this(null, null) {
26 public ContainerBuilder() : this(null, null) {
27 }
27 }
28
28
29 public ContainerBuilder(IUnityContainer container, ContainerConfigurationSchema schema) {
29 public ContainerBuilder(IUnityContainer container, ContainerConfigurationSchema schema) {
30 m_container = container ?? new UnityContainer();
30 m_container = container ?? new UnityContainer();
31 m_resolver = new TypeResolver();
31 m_resolver = new TypeResolver();
32 m_schema = schema ?? ContainerConfigurationSchema.Default;
32 m_schema = schema ?? ContainerConfigurationSchema.Default;
33 }
33 }
34
34
35 public Type ResolveType(string typeReference) {
35 public Type ResolveType(string typeReference) {
36 var resolved = string.IsNullOrEmpty(typeReference) ? null : m_resolver.Resolve(typeReference, true);
36 var resolved = string.IsNullOrEmpty(typeReference) ? null : m_resolver.Resolve(typeReference, true);
37 Log.Debug("ResolveType('{0}'): {1}", typeReference, resolved?.FullName);
37 Log.Debug("ResolveType('{0}'): {1}", typeReference, resolved?.FullName);
38 return resolved;
38 return resolved;
39 }
39 }
40
40
41 public void Visit(ITypeRegistration registration) {
41 public void Visit(ITypeRegistration registration) {
42 Safe.ArgumentNotNull(registration, nameof(registration));
42 Safe.ArgumentNotNull(registration, nameof(registration));
43
43
44 var registrationType = registration.GetRegistrationType(this);
44 var registrationType = registration.GetRegistrationType(this);
45 var implementationType = registration.GetImplementationType(this) ?? registrationType;
45 var implementationType = registration.GetImplementationType(this) ?? registrationType;
46
46
47 if (registrationType == null)
47 if (registrationType == null)
48 throw new Exception($"A type must be specified for the registration {registration.Name}");
48 throw new Exception($"A type must be specified for the registration {registration.Name}");
49
49
50 var builder = new TypeRegistrationBuilder(
50 var builder = new TypeRegistrationBuilder(
51 m_resolver,
51 m_resolver,
52 registrationType,
52 registrationType,
53 implementationType
53 implementationType,
54 this
54 );
55 );
55
56
56 builder.Lifetime = registration.GetLifetime(this);
57 builder.Lifetime = registration.GetLifetime(this);
57
58
58 if (registration.MemberInjections != null) {
59 if (registration.MemberInjections != null) {
59 foreach(var member in registration.MemberInjections)
60 foreach(var member in registration.MemberInjections)
60 member.Visit(builder);
61 member.Visit(builder);
61 }
62 }
62
63
63 m_container.RegisterType(
64 m_container.RegisterType(
64 builder.RegistrationType,
65 builder.RegistrationType,
65 builder.ImplementationType,
66 builder.ImplementationType,
66 registration.Name,
67 registration.Name,
67 builder.Lifetime,
68 builder.Lifetime,
68 builder.Injections
69 builder.Injections
69 );
70 );
70 }
71 }
71
72
72 public void Visit(IInstanceRegistration registration) {
73 public void Visit(IInstanceRegistration registration) {
73 Safe.ArgumentNotNull(registration, nameof(registration));
74 Safe.ArgumentNotNull(registration, nameof(registration));
74
75
75 var registrationType = registration.GetRegistrationType(this);
76 var registrationType = registration.GetRegistrationType(this);
76
77
77 var builder = new InstanceRegistrationBuilder (
78 var builder = new InstanceRegistrationBuilder (
78 m_resolver,
79 m_resolver,
79 registrationType
80 registrationType,
81 this
80 );
82 );
81
83
82 builder.Lifetime = registration.GetLifetime(this);
84 builder.Lifetime = registration.GetLifetime(this);
83
85
84 if (registration.MemberInjections != null) {
86 if (registration.MemberInjections != null) {
85 foreach(var member in registration.MemberInjections)
87 foreach(var member in registration.MemberInjections)
86 member.Visit(builder.ValueBuilder);
88 member.Visit(builder.ValueBuilder);
87 }
89 }
88
90
89 if (builder.RegistrationType == null && builder.ValueBuilder.ValueType == null)
91 if (builder.RegistrationType == null && builder.ValueBuilder.ValueType == null)
90 throw new Exception($"A type must be specified for the registration {registration.Name}");
92 throw new Exception($"A type must be specified for the registration {registration.Name}");
91
93
92 m_container.RegisterInstance(
94 m_container.RegisterInstance(
93 builder.RegistrationType ?? builder.ValueBuilder.ValueType,
95 builder.RegistrationType ?? builder.ValueBuilder.ValueType,
94 registration.Name,
96 registration.Name,
95 builder.ValueBuilder.Value,
97 builder.ValueBuilder.Value,
96 builder.Lifetime
98 builder.Lifetime
97 );
99 );
98 }
100 }
99
101
100 public void AddNamespace(string ns) {
102 public void AddNamespace(string ns) {
101 m_resolver.AddNamespace(ns);
103 m_resolver.AddNamespace(ns);
102 }
104 }
103
105
104 public void AddAssembly(string assembly) {
106 public void AddAssembly(string assembly) {
105
107
106 }
108 }
107
109
108 /// <summary>
110 /// <summary>
109 /// Includes the confguration. Creates a new <see cref="ContainerBuilder"/>,
111 /// Includes the confguration. Creates a new <see cref="ContainerBuilder"/>,
110 /// and loads the configuration to it. The created builder will share the
112 /// and loads the configuration to it. The created builder will share the
111 /// container and will have its own isolated type resolver.
113 /// container and will have its own isolated type resolver.
112 /// </summary>
114 /// </summary>
113 /// <param name="file">A path to configuration relative to the current configuration.</param>
115 /// <param name="file">A path to configuration relative to the current configuration.</param>
114 public void Include(string file) {
116 public void Include(string file) {
115 var includeContext = new ContainerBuilder(m_container, m_schema);
117 var includeContext = new ContainerBuilder(m_container, m_schema);
116
118
117 if (m_location != null) {
119 if (m_location != null) {
118 var uri = new Uri(m_location, file);
120 var uri = new Uri(m_location, file);
119 includeContext.LoadConfig(uri);
121 includeContext.LoadConfig(uri);
120 } else {
122 } else {
121 includeContext.LoadConfig(file);
123 includeContext.LoadConfig(file);
122 }
124 }
123 }
125 }
124
126
125 /// <summary>
127 /// <summary>
128 /// Resolves a path ralatively to the current container configuration location.
129 /// </summary>
130 /// <param name="location">A path yto resolve</param>
131 /// <returns>Resolved Uri fot the specified location</returns>
132 public Uri MakeLocationUri(string location) {
133 return m_location != null ? new Uri(m_location, location) : new Uri(location);
134 }
135
136 /// <summary>
126 /// Loads a configuration from the specified local file.
137 /// Loads a configuration from the specified local file.
127 /// </summary>
138 /// </summary>
128 /// <param name="file">The path to the configuration file.</param>
139 /// <param name="file">The path to the configuration file.</param>
129 public void LoadConfig(string file) {
140 public void LoadConfig(string file) {
130 Safe.ArgumentNotEmpty(file, nameof(file));
141 Safe.ArgumentNotEmpty(file, nameof(file));
131
142
132 LoadConfig(new Uri(Path.GetFullPath(file)));
143 LoadConfig(new Uri(Path.GetFullPath(file)));
133 }
144 }
134
145
135 public void LoadConfig(Uri location) {
146 public void LoadConfig(Uri location) {
136 Safe.ArgumentNotNull(location, nameof(location));
147 Safe.ArgumentNotNull(location, nameof(location));
137
148
138 m_location = location;
149 m_location = location;
139
150
140 var config = m_schema.LoadConfig(location.ToString());
151 var config = m_schema.LoadConfig(location.ToString());
141 config.Visit(this);
152 config.Visit(this);
142 }
153 }
143
154
144 }
155 }
145 } No newline at end of file
156 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerConfigurationSchema.cs to Implab.ServiceHost/src/Unity/ContainerConfigurationSchema.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerConfigurationSchema.cs to Implab.ServiceHost/src/Unity/ContainerConfigurationSchema.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerElement.cs to Implab.ServiceHost/src/Unity/ContainerElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerElement.cs to Implab.ServiceHost/src/Unity/ContainerElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerLifetimeElement.cs to Implab.ServiceHost/src/Unity/ContainerLifetimeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContainerLifetimeElement.cs to Implab.ServiceHost/src/Unity/ContainerLifetimeElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContextLifetimeElement.cs to Implab.ServiceHost/src/Unity/ContextLifetimeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ContextLifetimeElement.cs to Implab.ServiceHost/src/Unity/ContextLifetimeElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/DefaultParameterElement.cs to Implab.ServiceHost/src/Unity/DefaultParameterElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/DefaultParameterElement.cs to Implab.ServiceHost/src/Unity/DefaultParameterElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/DependencyParameterElement.cs to Implab.ServiceHost/src/Unity/DependencyParameterElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/DependencyParameterElement.cs to Implab.ServiceHost/src/Unity/DependencyParameterElement.cs
@@ -1,63 +1,78
1 using System;
1 using System;
2 using System.Collections.Generic;
2 using System.Collections.Generic;
3 using System.Reflection;
3 using System.Reflection;
4 using Implab.Components;
4 using Implab.Components;
5 using Unity;
5 using Unity;
6 using Unity.Injection;
6 using Unity.Injection;
7 using Unity.Lifetime;
7 using Unity.Lifetime;
8
8
9 namespace Implab.ServiceHost.Unity {
9 namespace Implab.ServiceHost.Unity {
10 public class FactoryActivator : ITypeRegistration {
10 public class FactoryActivator : ITypeRegistration {
11
11
12 class FactoryInjector : ITypeMemberInjection {
12 class FactoryInjector : ITypeMemberInjection {
13 public InjectionFactory Factory { get; set; }
13 public InjectionFactory Factory { get; set; }
14 public void Visit(TypeRegistrationBuilder builder) {
14 public void Visit(TypeRegistrationBuilder builder) {
15 builder.AddInjectionMember(Factory);
15 builder.AddInjectionMember(Factory);
16 }
16 }
17 }
17 }
18
18
19
19
20 public Type FactoryType { get; set; }
20 public Type FactoryType { get; set; }
21
21
22 public string FactoryName { get; set; }
22 public string FactoryName { get; set; }
23
23
24 public Type RegistrationType { get; set; }
24 public Type RegistrationType { get; set; }
25
25
26 public LifetimeManager Lifetime { get; set; }
26 public LifetimeManager Lifetime { get; set; }
27
27
28 public IEnumerable<ITypeMemberInjection> MemberInjections {
28 public IEnumerable<ITypeMemberInjection> MemberInjections {
29 get {
29 get {
30 yield return new FactoryInjector {
30 if (RegistrationType == null)
31 Factory = (InjectionFactory)GetType()
31 throw new Exception($"RegistrationType must be specified");
32 .GetMethod(nameof(CreateInjectionFactory), BindingFlags.Static | BindingFlags.NonPublic)
32 if (!typeof(IFactory<>).MakeGenericType(RegistrationType).IsAssignableFrom(FactoryType))
33 .MakeGenericMethod(FactoryType, RegistrationType)
33 throw new Exception($"The factory {FactoryType} can't be used to create {RegistrationType} instances");
34 .Invoke(null, new [] { FactoryName })
34
35 };
35 if (FactoryType.ContainsGenericParameters) {
36 yield return new FactoryInjector {
37 Factory = CreateDynamicInjectionFactory(FactoryName)
38 };
39 } else {
40 yield return new FactoryInjector {
41 Factory = (InjectionFactory)GetType()
42 .GetMethod(nameof(CreateInjectionFactory), BindingFlags.Static | BindingFlags.NonPublic)
43 .MakeGenericMethod(FactoryType, RegistrationType)
44 .Invoke(null, new [] { FactoryName })
45 };
46 }
36 }
47 }
37 }
48 }
38
49
39 public string Name { get; set; }
50 public string Name { get; set; }
40
51
41 public Type GetRegistrationType(ContainerBuilder builder) {
52 public Type GetRegistrationType(ContainerBuilder builder) {
42 return RegistrationType;
53 return RegistrationType;
43 }
54 }
44
55
45 public LifetimeManager GetLifetime(ContainerBuilder builder) {
56 public LifetimeManager GetLifetime(ContainerBuilder builder) {
46 return Lifetime;
57 return Lifetime;
47 }
58 }
48
59
49 public Type GetImplementationType(ContainerBuilder builder) {
60 public Type GetImplementationType(ContainerBuilder builder) {
50 return null;
61 return null;
51 }
62 }
52
63
53 /// <summary>
64 /// <summary>
54 /// Указывает зависимость, реализующую интерфейс <see cref="IFactory{TObj}"/>,
65 /// Указывает зависимость, реализующую интерфейс <see cref="IFactory{TObj}"/>,
55 /// которая будет использоваться в качестве фабрики для создания объектов
66 /// которая будет использоваться в качестве фабрики для создания объектов
56 /// </summary>
67 /// </summary>
57 /// <param name="dependencyName"></param>
68 /// <param name="dependencyName"></param>
58 static InjectionFactory CreateInjectionFactory<TFac, TObj>(string dependencyName) where TFac : IFactory<TObj> {
69 static InjectionFactory CreateInjectionFactory<TFac, TObj>(string dependencyName) where TFac : IFactory<TObj> {
59
70
60 return new InjectionFactory(c => c.Resolve<TFac>(dependencyName).Create());
71 return new InjectionFactory(c => c.Resolve<TFac>(dependencyName).Create());
61 }
72 }
73
74 static InjectionFactory CreateDynamicInjectionFactory(string dependencyName) {
75 return new InjectionFactory((c,t,name) => ((IFactory<object>)c.Resolve(t, dependencyName)).Create());
76 }
62 }
77 }
63 } No newline at end of file
78 }
@@ -1,73 +1,73
1 using System;
1 using System;
2 using System.Xml.Serialization;
2 using System.Xml.Serialization;
3 using Implab.Components;
3 using Implab.Components;
4
4
5 namespace Implab.ServiceHost.Unity {
5 namespace Implab.ServiceHost.Unity {
6 /// <summary>
6 /// <summary>
7 /// Расширяет стандартную регистрацию типа до фабрики, вместе с регистрацией
7 /// Расширяет стандартную регистрацию типа до фабрики, вместе с регистрацией
8 /// самой фабрики создаются регистрации сервисов, которые она предоставляет.
8 /// самой фабрики создаются регистрации сервисов, которые она предоставляет.
9 /// </summary>
9 /// </summary>
10 public class FactoryElement : RegisterElement, ITypeRegistration {
10 public class FactoryElement : RegisterElement, ITypeRegistration {
11
11
12 /// <summary>
12 /// <summary>
13 /// Записи о сервисах, которые создаются данной фабрикой.
13 /// Записи о сервисах, которые создаются данной фабрикой.
14 /// </summary>
14 /// </summary>
15 /// <remarks>
15 /// <remarks>
16 /// Сервисы, которые указаны в регистарциях они должны соответсвовать тому,
16 /// Сервисы, которые указаны в регистарциях они должны соответсвовать тому,
17 /// что фабрика возвращает, но это остается на откуп контейнера
17 /// что фабрика возвращает, но это остается на откуп контейнера
18 /// </remarks>
18 /// </remarks>
19 [XmlElement("provides")]
19 [XmlElement("provides")]
20 public ProvidesElement[] Provides { get; set; }
20 public ProvidesElement[] Provides { get; set; }
21
21
22 /// <summary>
22 /// <summary>
23 /// Переопределяет стандарное поведение регистрации типа в контейнере,
23 /// Переопределяет стандарное поведение регистрации типа в контейнере,
24 /// дополняя его регистрацией фабричных методов для получения типов.
24 /// дополняя его регистрацией фабричных методов для получения типов.
25 /// </summary>
25 /// </summary>
26 /// <param name="builder">Объект для конфигурирования контейнера.</param>
26 /// <param name="builder">Объект для конфигурирования контейнера.</param>
27 public override void Visit(ContainerBuilder builder) {
27 public override void Visit(ContainerBuilder builder) {
28 var factoryType = GetRegistrationType(builder.ResolveType);
28 var factoryType = GetRegistrationType(builder.ResolveType);
29
29
30 base.Visit(builder);
30 base.Visit(builder);
31
31
32 if (Provides != null && Provides.Length > 0) {
32 if (Provides != null && Provides.Length > 0) {
33 // если регистрации явно заданы, используеися информация из них
33 // если регистрации явно заданы, используеися информация из них
34 foreach(var item in Provides) {
34 foreach(var item in Provides) {
35 var activator = new FactoryActivator {
35 var activator = new FactoryActivator {
36 Name = item.RegistrationName,
36 Name = item.RegistrationName,
37 RegistrationType = builder.ResolveType(item.RegistrationType),
37 RegistrationType = builder.ResolveType(item.RegistrationType),
38 FactoryName = Name,
38 FactoryName = Name,
39 FactoryType = factoryType,
39 FactoryType = factoryType,
40 Lifetime = item.Lifetime.GetLifetime(builder)
40 Lifetime = item.Lifetime?.GetLifetime(builder)
41 };
41 };
42 builder.Visit(activator);
42 builder.Visit(activator);
43 }
43 }
44 } else {
44 } else {
45 // если регистрация явно не задана, в качестве сервиса для регистрации
45 // если регистрация явно не задана, в качестве сервиса для регистрации
46 // используется тип создаваемый фабрикой, который будет добавлен в контейнер
46 // используется тип создаваемый фабрикой, который будет добавлен в контейнер
47 // с темже именем, что и сама фабрика (разные типы могут иметь одно имя для регистрации)
47 // с темже именем, что и сама фабрика (разные типы могут иметь одно имя для регистрации)
48 var providedType = (
48 var providedType = (
49 factoryType.IsGenericType && factoryType.GetGenericTypeDefinition() == typeof(IFactory<>) ?
49 factoryType.IsGenericType && factoryType.GetGenericTypeDefinition() == typeof(IFactory<>) ?
50 factoryType :
50 factoryType :
51 factoryType.GetInterface(typeof(IFactory<>).FullName)
51 factoryType.GetInterface(typeof(IFactory<>).FullName)
52 )?
52 )?
53 .GetGenericArguments()[0];
53 .GetGenericArguments()[0];
54
54
55 // не удалось определеить тип
55 // не удалось определеить тип
56 if (providedType == null)
56 if (providedType == null)
57 throw new ArgumentException("Failed to determine a type provided by the factory");
57 throw new ArgumentException("Failed to determine a type provided by the factory");
58
58
59 if (providedType.IsGenericParameter)
59 if (providedType.IsGenericParameter)
60 throw new ArgumentException("Can't register a generic type paramter as a service");
60 throw new ArgumentException("Can't register a generic type paramter as a service");
61
61
62 var activator = new FactoryActivator {
62 var activator = new FactoryActivator {
63 Name = Name,
63 Name = Name,
64 RegistrationType = providedType,
64 RegistrationType = providedType,
65 FactoryName = Name,
65 FactoryName = Name,
66 FactoryType = factoryType
66 FactoryType = factoryType
67 };
67 };
68
68
69 builder.Visit(activator);
69 builder.Visit(activator);
70 }
70 }
71 }
71 }
72 }
72 }
73 } No newline at end of file
73 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/HierarchicalLifetimeElement.cs to Implab.ServiceHost/src/Unity/HierarchicalLifetimeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/HierarchicalLifetimeElement.cs to Implab.ServiceHost/src/Unity/HierarchicalLifetimeElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/IInjectionParameter.cs to Implab.ServiceHost/src/Unity/IInjectionParameter.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/IInjectionParameter.cs to Implab.ServiceHost/src/Unity/IInjectionParameter.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/IInstanceRegistration.cs to Implab.ServiceHost/src/Unity/IInstanceRegistration.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/IInstanceRegistration.cs to Implab.ServiceHost/src/Unity/IInstanceRegistration.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/IRegistration.cs to Implab.ServiceHost/src/Unity/IRegistration.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/IRegistration.cs to Implab.ServiceHost/src/Unity/IRegistration.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ITypeMemberInjection.cs to Implab.ServiceHost/src/Unity/ITypeMemberInjection.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ITypeMemberInjection.cs to Implab.ServiceHost/src/Unity/ITypeMemberInjection.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ITypeRegistration.cs to Implab.ServiceHost/src/Unity/ITypeRegistration.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ITypeRegistration.cs to Implab.ServiceHost/src/Unity/ITypeRegistration.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/IncludeElement.cs to Implab.ServiceHost/src/Unity/IncludeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/IncludeElement.cs to Implab.ServiceHost/src/Unity/IncludeElement.cs
@@ -1,137 +1,142
1 using System;
1 using System;
2 using System.Collections;
2 using System.Collections;
3 using System.Collections.Generic;
3 using System.Collections.Generic;
4 using System.ComponentModel;
4 using System.ComponentModel;
5 using System.Linq;
5 using System.Linq;
6 using System.Xml.Serialization;
6 using System.Xml.Serialization;
7 using Unity.Injection;
7 using Unity.Injection;
8
8
9 namespace Implab.ServiceHost.Unity {
9 namespace Implab.ServiceHost.Unity {
10
10
11 public class InjectionParameterBuilder {
11 public class InjectionParameterBuilder {
12
12
13 readonly TypeResolver m_resolver;
13 readonly TypeResolver m_resolver;
14
14
15 public Type DefaultType { get; private set; }
15 public Type DefaultType { get; private set; }
16
16
17 public Type ValueType { get; private set; }
17 public Type ValueType { get; private set; }
18
18
19 public ContainerBuilder Root { get; private set; }
20
19 object m_value;
21 object m_value;
20
22
21 public object Value {
23 public object Value {
22 get {
24 get {
23 if (!ValueSpecified)
25 if (!ValueSpecified)
24 throw new InvalidOperationException("The regular value must be set (dependency or array are not situable in this context)");
26 throw new InvalidOperationException("The regular value must be set (dependency or array are not situable in this context)");
25 return m_value;
27 return m_value;
26 }
28 }
27 }
29 }
28
30
29 public bool ValueSpecified { get; private set; }
31 public bool ValueSpecified { get; private set; }
30
32
31 InjectionParameterValue m_injection;
33 InjectionParameterValue m_injection;
32
34
33 public InjectionParameterValue Injection {
35 public InjectionParameterValue Injection {
34 get {
36 get {
35 if (m_injection == null)
37 if (m_injection == null)
36 throw new InvalidOperationException("The injection parameter is not specified");
38 throw new InvalidOperationException("The injection parameter is not specified");
37 return m_injection;
39 return m_injection;
38 }
40 }
39 }
41 }
40
42
41 public bool InjectionSpecified {
43 public bool InjectionSpecified {
42 get { return m_injection != null; }
44 get { return m_injection != null; }
43 }
45 }
44
46
45 internal InjectionParameterBuilder(TypeResolver resolver, Type defaultType) {
47 internal InjectionParameterBuilder(TypeResolver resolver, Type defaultType, ContainerBuilder root) {
46 m_resolver = resolver;
48 m_resolver = resolver;
47 DefaultType = defaultType;
49 DefaultType = defaultType;
50 Root = root;
48 }
51 }
49
52
50 public Type ResolveInjectedValueType(string typeSpec) {
53 public Type ResolveInjectedValueType(string typeSpec) {
51 if (string.IsNullOrEmpty(typeSpec)) {
54 if (string.IsNullOrEmpty(typeSpec)) {
52 if (DefaultType == null)
55 if (DefaultType == null)
53 throw new Exception("The type must be specified");
56 throw new Exception("The type must be specified");
54 return DefaultType;
57 return DefaultType;
55 }
58 }
56 return m_resolver.Resolve(typeSpec, true);
59 return m_resolver.Resolve(typeSpec, true);
57 }
60 }
58
61
59 public Type ResolveType(string typeSpec) {
62 public Type ResolveType(string typeSpec) {
60 return string.IsNullOrEmpty(typeSpec) ? null : m_resolver.Resolve(typeSpec, true);
63 return string.IsNullOrEmpty(typeSpec) ? null : m_resolver.Resolve(typeSpec, true);
61 }
64 }
62
65
63 public void SetValue(Type type, object value) {
66 public void SetValue(Type type, object value) {
64 Safe.ArgumentNotNull(type, nameof(type));
67 Safe.ArgumentNotNull(type, nameof(type));
65
68
66 ValueType = type;
69 ValueType = type;
67 m_value = value;
70 m_value = value;
68 ValueSpecified = true;
71 ValueSpecified = true;
69
72
70 m_injection = new InjectionParameter(type, value);
73 m_injection = new InjectionParameter(type, value);
71 }
74 }
72
75
73 public void SetDependency(Type type, string name, bool optional) {
76 public void SetDependency(Type type, string name, bool optional) {
74 Safe.ArgumentNotNull(type, nameof(type));
77 Safe.ArgumentNotNull(type, nameof(type));
75
78
76 ValueType = type;
79 ValueType = type;
77 ValueSpecified = false;
80 ValueSpecified = false;
78 m_value = null;
81 m_value = null;
79
82
80 m_injection = optional ? (InjectionParameterValue)new OptionalParameter(type, name) : new ResolvedParameter(type, name);
83 m_injection = optional ?
84 type.IsGenericParameter ?
85 new OptionalGenericParameter(type.Name, name)
86 : (InjectionParameterValue)new OptionalParameter(type, name)
87 : new ResolvedParameter(type, name);
81 }
88 }
82
89
83 internal void Visit(ArrayParameterElement arrayParameter) {
90 internal void Visit(ArrayParameterElement arrayParameter) {
84 Type itemsType = null;
91 Type itemsType = null;
85 var arrayType = string.IsNullOrEmpty(arrayParameter.TypeName) ? null : ResolveType(arrayParameter.TypeName);
92 var arrayType = string.IsNullOrEmpty(arrayParameter.TypeName) ? null : ResolveType(arrayParameter.TypeName);
86
93
87 if (arrayType == null)
94 if (arrayType == null)
88 arrayType = DefaultType;
95 arrayType = DefaultType;
89
96
90
97
91 if (!string.IsNullOrEmpty(arrayParameter.ItemsType)) {
98 if (!string.IsNullOrEmpty(arrayParameter.ItemsType)) {
92 itemsType = ResolveType(arrayParameter.ItemsType);
99 itemsType = ResolveType(arrayParameter.ItemsType);
93 arrayType = itemsType.MakeArrayType();
100 arrayType = itemsType.MakeArrayType();
94 } else {
101 } else {
95 itemsType = GetItemsType(arrayType);
102 itemsType = GetItemsType(arrayType);
96 }
103 }
97
104
98 if (itemsType == null)
105 if (itemsType == null)
99 throw new Exception("Failed to determine array elements type");
106 throw new Exception("Failed to determine array elements type");
100
107
101 InjectionParameterValue[] injections = (arrayParameter.Items ?? new AbstractInjectionParameter[0])
108 InjectionParameterValue[] injections = (arrayParameter.Items ?? new AbstractInjectionParameter[0])
102 .Select(x => {
109 .Select(x => {
103 var builder = new InjectionParameterBuilder(m_resolver, itemsType);
110 var builder = new InjectionParameterBuilder(m_resolver, itemsType, Root);
104 x.Visit(builder);
111 x.Visit(builder);
105 return builder.Injection;
112 return builder.Injection;
106 })
113 })
107 .ToArray();
114 .ToArray();
108
115
109 var array = itemsType.IsGenericParameter ?
116 m_injection = itemsType.IsGenericParameter ?
110 (InjectionParameterValue)new GenericResolvedArrayParameter(itemsType.Name, injections) :
117 (InjectionParameterValue)new GenericResolvedArrayParameter(itemsType.Name, injections) :
111 new ResolvedArrayParameter(itemsType, injections);
118 new ResolvedArrayParameter(itemsType, injections);
112
119
113 ValueType = arrayType;
120 ValueType = arrayType;
114 m_value = null;
121 m_value = null;
115 ValueSpecified = false;
122 ValueSpecified = false;
116
117 m_injection = array;
118 }
123 }
119
124
120 Type GetItemsType(Type collectionType) {
125 Type GetItemsType(Type collectionType) {
121 if (collectionType == null)
126 if (collectionType == null)
122 return null;
127 return null;
123
128
124 Type itemsType = null;
129 Type itemsType = null;
125
130
126 if (collectionType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
131 if (collectionType.IsGenericType && collectionType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
127 itemsType = collectionType.GetGenericArguments()[0];
132 itemsType = collectionType.GetGenericArguments()[0];
128 } else if (collectionType == typeof(IEnumerable)) {
133 } else if (collectionType == typeof(IEnumerable)) {
129 itemsType = typeof(object);
134 itemsType = typeof(object);
130 } else {
135 } else {
131 itemsType = collectionType.GetInterface(typeof(IEnumerable<>).FullName)?.GetGenericArguments()[0];
136 itemsType = collectionType.GetInterface(typeof(IEnumerable<>).FullName)?.GetGenericArguments()[0];
132 }
137 }
133
138
134 return itemsType;
139 return itemsType;
135 }
140 }
136 }
141 }
137 } No newline at end of file
142 }
@@ -1,13 +1,13
1 using System;
1 using System;
2
2
3 namespace Implab.ServiceHost.Unity
3 namespace Implab.ServiceHost.Unity
4 {
4 {
5 public class InstanceRegistrationBuilder : RegistrationBuilder {
5 public class InstanceRegistrationBuilder : RegistrationBuilder {
6
6
7 public InjectionParameterBuilder ValueBuilder { get; private set; }
7 public InjectionParameterBuilder ValueBuilder { get; private set; }
8
8
9 internal InstanceRegistrationBuilder(TypeResolver typeResolver, Type registrationType) : base(registrationType) {
9 internal InstanceRegistrationBuilder(TypeResolver typeResolver, Type registrationType, ContainerBuilder root) : base(registrationType, root) {
10 ValueBuilder = new InjectionParameterBuilder(typeResolver, registrationType);
10 ValueBuilder = new InjectionParameterBuilder(typeResolver, registrationType, root);
11 }
11 }
12 }
12 }
13 } No newline at end of file
13 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/LifetimeElement.cs to Implab.ServiceHost/src/Unity/LifetimeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/LifetimeElement.cs to Implab.ServiceHost/src/Unity/LifetimeElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/MethodInjectionElement.cs to Implab.ServiceHost/src/Unity/MethodInjectionElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/MethodInjectionElement.cs to Implab.ServiceHost/src/Unity/MethodInjectionElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/NamespaceElement.cs to Implab.ServiceHost/src/Unity/NamespaceElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/NamespaceElement.cs to Implab.ServiceHost/src/Unity/NamespaceElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/NestedTypeReference.cs to Implab.ServiceHost/src/Unity/NestedTypeReference.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/NestedTypeReference.cs to Implab.ServiceHost/src/Unity/NestedTypeReference.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/PropertyInjectionElement.cs to Implab.ServiceHost/src/Unity/PropertyInjectionElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/PropertyInjectionElement.cs to Implab.ServiceHost/src/Unity/PropertyInjectionElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ProvidesElement.cs to Implab.ServiceHost/src/Unity/ProvidesElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ProvidesElement.cs to Implab.ServiceHost/src/Unity/ProvidesElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/RegisterElement.cs to Implab.ServiceHost/src/Unity/RegisterElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/RegisterElement.cs to Implab.ServiceHost/src/Unity/RegisterElement.cs
@@ -1,27 +1,32
1 using System;
1 using System;
2 using System.Collections.Generic;
2 using System.Collections.Generic;
3 using System.ComponentModel;
3 using System.ComponentModel;
4 using System.Linq;
4 using System.Linq;
5 using System.Xml.Serialization;
5 using System.Xml.Serialization;
6 using Implab.Xml;
6 using Implab.Xml;
7 using Unity.Injection;
7 using Unity.Injection;
8 using Unity.Lifetime;
8 using Unity.Lifetime;
9 using Unity.Registration;
9 using Unity.Registration;
10
10
11 namespace Implab.ServiceHost.Unity {
11 namespace Implab.ServiceHost.Unity {
12 /// <summary>
12 /// <summary>
13 /// Базовый класс для формирования записей в контейнере, созволяет указать время жизни для записи
13 /// Базовый класс для формирования записей в контейнере, созволяет указать время жизни для записи
14 /// </summary>
14 /// </summary>
15 public abstract class RegistrationBuilder {
15 public abstract class RegistrationBuilder {
16 public ContainerBuilder Root {
17 get; private set;
18 }
19
16 public Type RegistrationType {
20 public Type RegistrationType {
17 get;
21 get;
18 private set;
22 private set;
19 }
23 }
20
24
21 internal LifetimeManager Lifetime { get; set; }
25 internal LifetimeManager Lifetime { get; set; }
22
26
23 protected RegistrationBuilder(Type registrationType) {
27 protected RegistrationBuilder(Type registrationType, ContainerBuilder root) {
28 Root = root;
24 RegistrationType = registrationType;
29 RegistrationType = registrationType;
25 }
30 }
26 }
31 }
27 } No newline at end of file
32 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/RootTypeReference.cs to Implab.ServiceHost/src/Unity/RootTypeReference.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/RootTypeReference.cs to Implab.ServiceHost/src/Unity/RootTypeReference.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/Schema.cs to Implab.ServiceHost/src/Unity/Schema.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/Schema.cs to Implab.ServiceHost/src/Unity/Schema.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/SerializedElement.cs to Implab.ServiceHost/src/Unity/SerializedElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/SerializedElement.cs to Implab.ServiceHost/src/Unity/SerializedElement.cs
@@ -1,33 +1,33
1 using System;
1 using System;
2 using System.Xml;
2 using System.Xml;
3 using System.Xml.Schema;
3 using System.Xml.Schema;
4 using System.Xml.Serialization;
4 using System.Xml.Serialization;
5
5
6 namespace Implab.ServiceHost.Unity
6 namespace Implab.ServiceHost.Unity
7 {
7 {
8 public class SerializedParameterElement : AbstractInjectionParameter {
8 public class SerializedParameterElement : AbstractInjectionParameter {
9 [XmlAttribute("href")]
9 [XmlAttribute("href")]
10 public string Location { get; set; }
10 public string Location { get; set; }
11
11
12 [XmlAnyElement]
12 [XmlAnyElement]
13 public XmlElement[] Content { get; set; }
13 public XmlElement[] Content { get; set; }
14
14
15 public XmlReader GetReader() {
15 public XmlReader GetReader(InjectionParameterBuilder builder) {
16 if (!string.IsNullOrEmpty(Location))
16 if (!string.IsNullOrEmpty(Location))
17 return XmlReader.Create(Location);
17 return XmlReader.Create(builder.Root.MakeLocationUri(Location).ToString());
18 if (Content != null && Content.Length > 0)
18 if (Content != null && Content.Length > 0)
19 return Content[0].CreateNavigator().ReadSubtree();
19 return Content[0].CreateNavigator().ReadSubtree();
20
20
21 throw new Exception("No content found, expected XML document");
21 throw new Exception("No content found, expected XML document");
22 }
22 }
23
23
24 public override void Visit(InjectionParameterBuilder builder) {
24 public override void Visit(InjectionParameterBuilder builder) {
25 var type = builder.ResolveInjectedValueType(TypeName);
25 var type = builder.ResolveInjectedValueType(TypeName);
26
26
27 var serializer = new XmlSerializer(type);
27 var serializer = new XmlSerializer(type);
28 using(var reader = GetReader())
28 using(var reader = GetReader(builder))
29 builder.SetValue(type, serializer.Deserialize(reader));
29 builder.SetValue(type, serializer.Deserialize(reader));
30
30
31 }
31 }
32 }
32 }
33 } No newline at end of file
33 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/SingletonLifetimeElement.cs to Implab.ServiceHost/src/Unity/SingletonLifetimeElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/SingletonLifetimeElement.cs to Implab.ServiceHost/src/Unity/SingletonLifetimeElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/SpecializedTypeReference.cs to Implab.ServiceHost/src/Unity/SpecializedTypeReference.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/SpecializedTypeReference.cs to Implab.ServiceHost/src/Unity/SpecializedTypeReference.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeReference.cs to Implab.ServiceHost/src/Unity/TypeReference.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeReference.cs to Implab.ServiceHost/src/Unity/TypeReference.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeReferenceParser.cs to Implab.ServiceHost/src/Unity/TypeReferenceParser.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeReferenceParser.cs to Implab.ServiceHost/src/Unity/TypeReferenceParser.cs
@@ -1,81 +1,81
1 using System;
1 using System;
2 using System.Collections.Generic;
2 using System.Collections.Generic;
3 using System.Linq;
3 using System.Linq;
4 using Unity.Injection;
4 using Unity.Injection;
5 using Unity.Registration;
5 using Unity.Registration;
6
6
7 namespace Implab.ServiceHost.Unity {
7 namespace Implab.ServiceHost.Unity {
8 public class TypeRegistrationBuilder : RegistrationBuilder {
8 public class TypeRegistrationBuilder : RegistrationBuilder {
9
9
10 readonly TypeResolver m_resolver;
10 readonly TypeResolver m_resolver;
11
11
12 readonly List<InjectionMember> m_injections = new List<InjectionMember>();
12 readonly List<InjectionMember> m_injections = new List<InjectionMember>();
13
13
14 internal InjectionMember[] Injections { get { return m_injections.ToArray(); } }
14 internal InjectionMember[] Injections { get { return m_injections.ToArray(); } }
15
15
16 public Type ImplementationType {
16 public Type ImplementationType {
17 get;
17 get;
18 private set;
18 private set;
19 }
19 }
20
20
21 internal TypeRegistrationBuilder(TypeResolver resolver, Type registrationType, Type implementationType) : base(registrationType) {
21 internal TypeRegistrationBuilder(TypeResolver resolver, Type registrationType, Type implementationType, ContainerBuilder root) : base(registrationType, root) {
22 ImplementationType = implementationType;
22 ImplementationType = implementationType;
23
23
24 // when registering a generic mapping, register all generic parameter names as local types
24 // when registering a generic mapping, register all generic parameter names as local types
25 if (ImplementationType.IsGenericTypeDefinition) {
25 if (ImplementationType.IsGenericTypeDefinition) {
26 m_resolver = new TypeResolver(resolver);
26 m_resolver = new TypeResolver(resolver);
27
27
28 foreach (var p in ImplementationType.GetGenericArguments())
28 foreach (var p in ImplementationType.GetGenericArguments())
29 m_resolver.AddMapping(p.Name, p);
29 m_resolver.AddMapping(p.Name, p);
30 } else {
30 } else {
31 m_resolver = resolver;
31 m_resolver = resolver;
32 }
32 }
33 }
33 }
34
34
35 internal void Visit(ConstructorInjectionElement constructorInjection) {
35 internal void Visit(ConstructorInjectionElement constructorInjection) {
36
36
37
37
38 var parameters = constructorInjection.Parameters?
38 var parameters = constructorInjection.Parameters?
39 .Select(x => {
39 .Select(x => {
40 var valueBuilder = new InjectionParameterBuilder(m_resolver, null);
40 var valueBuilder = new InjectionParameterBuilder(m_resolver, null, Root);
41 x.Visit(valueBuilder);
41 x.Visit(valueBuilder);
42 return valueBuilder.Injection;
42 return valueBuilder.Injection;
43 })
43 })
44 .ToArray();
44 .ToArray();
45
45
46 var injection = parameters != null ? new InjectionConstructor(parameters) : new InjectionConstructor();
46 var injection = parameters != null ? new InjectionConstructor(parameters) : new InjectionConstructor();
47 m_injections.Add(injection);
47 m_injections.Add(injection);
48 }
48 }
49
49
50 internal void Visit(MethodInjectionElement methodInjection) {
50 internal void Visit(MethodInjectionElement methodInjection) {
51 var parameters = methodInjection.Parameters?
51 var parameters = methodInjection.Parameters?
52 .Select(x => {
52 .Select(x => {
53 var valueBuilder = new InjectionParameterBuilder(m_resolver, null);
53 var valueBuilder = new InjectionParameterBuilder(m_resolver, null, Root);
54 x.Visit(valueBuilder);
54 x.Visit(valueBuilder);
55 return valueBuilder.Injection;
55 return valueBuilder.Injection;
56 })
56 })
57 .ToArray();
57 .ToArray();
58
58
59 var injection = parameters != null ? new InjectionMethod(methodInjection.Name, parameters) : new InjectionMethod(methodInjection.Name);
59 var injection = parameters != null ? new InjectionMethod(methodInjection.Name, parameters) : new InjectionMethod(methodInjection.Name);
60 m_injections.Add(injection);
60 m_injections.Add(injection);
61 }
61 }
62
62
63 internal void Visit(PropertyInjectionElement propertyInjection) {
63 internal void Visit(PropertyInjectionElement propertyInjection) {
64 if (propertyInjection.Value == null)
64 if (propertyInjection.Value == null)
65 throw new Exception($"A value value must be specified for the property '{propertyInjection.Name}'");
65 throw new Exception($"A value value must be specified for the property '{propertyInjection.Name}'");
66
66
67 var propertyType = ImplementationType.GetProperty(propertyInjection.Name)?.PropertyType;
67 var propertyType = ImplementationType.GetProperty(propertyInjection.Name)?.PropertyType;
68 var valueContext = new InjectionParameterBuilder(m_resolver, propertyType);
68 var valueContext = new InjectionParameterBuilder(m_resolver, propertyType, Root);
69
69
70 propertyInjection.Value.Visit(valueContext);
70 propertyInjection.Value.Visit(valueContext);
71 var injection = new InjectionProperty(propertyInjection.Name, valueContext.Injection);
71 var injection = new InjectionProperty(propertyInjection.Name, valueContext.Injection);
72 m_injections.Add(injection);
72 m_injections.Add(injection);
73 }
73 }
74
74
75 public void AddInjectionMember(InjectionMember injection) {
75 public void AddInjectionMember(InjectionMember injection) {
76 Safe.ArgumentNotNull(injection, nameof(injection));
76 Safe.ArgumentNotNull(injection, nameof(injection));
77
77
78 m_injections.Add(injection);
78 m_injections.Add(injection);
79 }
79 }
80 }
80 }
81 } No newline at end of file
81 }
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeResolutionContext.cs to Implab.ServiceHost/src/Unity/TypeResolutionContext.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeResolutionContext.cs to Implab.ServiceHost/src/Unity/TypeResolutionContext.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeResolver.cs to Implab.ServiceHost/src/Unity/TypeResolver.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/TypeResolver.cs to Implab.ServiceHost/src/Unity/TypeResolver.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/UnityContainerExtensions.cs to Implab.ServiceHost/src/Unity/UnityContainerExtensions.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/UnityContainerExtensions.cs to Implab.ServiceHost/src/Unity/UnityContainerExtensions.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ValueElement.cs to Implab.ServiceHost/src/Unity/ValueElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ValueElement.cs to Implab.ServiceHost/src/Unity/ValueElement.cs
1 NO CONTENT: file renamed from Implab.ServiceHost/Unity/ValueParameterElement.cs to Implab.ServiceHost/src/Unity/ValueParameterElement.cs
NO CONTENT: file renamed from Implab.ServiceHost/Unity/ValueParameterElement.cs to Implab.ServiceHost/src/Unity/ValueParameterElement.cs
1 NO CONTENT: file renamed from Implab.Test/DiagnosticsTest.cs to Implab.Test/src/DiagnosticsTest.cs
NO CONTENT: file renamed from Implab.Test/DiagnosticsTest.cs to Implab.Test/src/DiagnosticsTest.cs
1 NO CONTENT: file renamed from Implab.Test/JsonTests.cs to Implab.Test/src/JsonTests.cs
NO CONTENT: file renamed from Implab.Test/JsonTests.cs to Implab.Test/src/JsonTests.cs
1 NO CONTENT: file renamed from Implab.Test/MockPollComponent.cs to Implab.Test/src/MockPollComponent.cs
NO CONTENT: file renamed from Implab.Test/MockPollComponent.cs to Implab.Test/src/MockPollComponent.cs
1 NO CONTENT: file renamed from Implab.Test/Model/Person.cs to Implab.Test/src/Model/Person.cs
NO CONTENT: file renamed from Implab.Test/Model/Person.cs to Implab.Test/src/Model/Person.cs
1 NO CONTENT: file renamed from Implab.Test/PromiseHelper.cs to Implab.Test/src/PromiseHelper.cs
NO CONTENT: file renamed from Implab.Test/PromiseHelper.cs to Implab.Test/src/PromiseHelper.cs
1 NO CONTENT: file renamed from Implab.Test/RunnableComponentTests.cs to Implab.Test/src/RunnableComponentTests.cs
NO CONTENT: file renamed from Implab.Test/RunnableComponentTests.cs to Implab.Test/src/RunnableComponentTests.cs
@@ -1,55 +1,69
1
1
2 Microsoft Visual Studio Solution File, Format Version 12.00
2 Microsoft Visual Studio Solution File, Format Version 12.00
3 # Visual Studio 15
3 # Visual Studio 15
4 VisualStudioVersion = 15.0.27428.2005
4 VisualStudioVersion = 15.0.27428.2005
5 MinimumVisualStudioVersion = 10.0.40219.1
5 MinimumVisualStudioVersion = 10.0.40219.1
6 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Implab", "Implab\Implab.csproj", "{FF2052B6-9C8F-4022-A347-F07ABF635885}"
6 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Implab", "Implab\Implab.csproj", "{FF2052B6-9C8F-4022-A347-F07ABF635885}"
7 EndProject
7 EndProject
8 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Implab.Test", "Implab.Test\Implab.Test.csproj", "{6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}"
8 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Implab.Test", "Implab.Test\Implab.Test.csproj", "{6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}"
9 EndProject
9 EndProject
10 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Playground", "Implab.Playground\Implab.Playground.csproj", "{100DFEB0-75BE-436F-ADDF-1F46EF433F46}"
10 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Playground", "Implab.Playground\Implab.Playground.csproj", "{100DFEB0-75BE-436F-ADDF-1F46EF433F46}"
11 EndProject
11 EndProject
12 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.ServiceHost", "Implab.ServiceHost\Implab.ServiceHost.csproj", "{8B79FCBE-50DD-40A0-9B5E-E572072E4868}"
12 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.ServiceHost", "Implab.ServiceHost\Implab.ServiceHost.csproj", "{8B79FCBE-50DD-40A0-9B5E-E572072E4868}"
13 EndProject
13 EndProject
14 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.ServiceHost.Test", "Implab.ServiceHost.Test\Implab.ServiceHost.Test.csproj", "{CB844F94-E555-4F25-A932-7CB85C98CF86}"
15 EndProject
14 Global
16 Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
17 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
18 Debug|Any CPU = Debug|Any CPU
17 Release|Any CPU = Release|Any CPU
19 Release|Any CPU = Release|Any CPU
18 Debug|x64 = Debug|x64
20 Debug|x64 = Debug|x64
19 Debug|x86 = Debug|x86
21 Debug|x86 = Debug|x86
20 Release|x64 = Release|x64
22 Release|x64 = Release|x64
21 Release|x86 = Release|x86
23 Release|x86 = Release|x86
22 EndGlobalSection
24 EndGlobalSection
23 GlobalSection(ProjectConfigurationPlatforms) = postSolution
25 GlobalSection(ProjectConfigurationPlatforms) = postSolution
24 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
26 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Debug|Any CPU.Build.0 = Debug|Any CPU
27 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Debug|Any CPU.Build.0 = Debug|Any CPU
26 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Release|Any CPU.ActiveCfg = Release|Any CPU
28 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Release|Any CPU.ActiveCfg = Release|Any CPU
27 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Release|Any CPU.Build.0 = Release|Any CPU
29 {FF2052B6-9C8F-4022-A347-F07ABF635885}.Release|Any CPU.Build.0 = Release|Any CPU
28 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Debug|Any CPU.Build.0 = Debug|Any CPU
31 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Debug|Any CPU.Build.0 = Debug|Any CPU
30 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Release|Any CPU.ActiveCfg = Release|Any CPU
32 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Release|Any CPU.ActiveCfg = Release|Any CPU
31 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Release|Any CPU.Build.0 = Release|Any CPU
33 {6CD0DA18-8D9B-4AA8-A3DC-17322E27335E}.Release|Any CPU.Build.0 = Release|Any CPU
32 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
34 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Debug|Any CPU.Build.0 = Debug|Any CPU
35 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Debug|Any CPU.Build.0 = Debug|Any CPU
34 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Release|Any CPU.ActiveCfg = Release|Any CPU
36 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Release|Any CPU.ActiveCfg = Release|Any CPU
35 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Release|Any CPU.Build.0 = Release|Any CPU
37 {100DFEB0-75BE-436F-ADDF-1F46EF433F46}.Release|Any CPU.Build.0 = Release|Any CPU
36 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
37 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|Any CPU.Build.0 = Debug|Any CPU
39 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|Any CPU.Build.0 = Debug|Any CPU
38 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x64.ActiveCfg = Debug|x64
40 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x64.ActiveCfg = Debug|x64
39 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x64.Build.0 = Debug|x64
41 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x64.Build.0 = Debug|x64
40 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x86.ActiveCfg = Debug|x86
42 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x86.ActiveCfg = Debug|x86
41 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x86.Build.0 = Debug|x86
43 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Debug|x86.Build.0 = Debug|x86
42 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|Any CPU.ActiveCfg = Release|Any CPU
44 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|Any CPU.Build.0 = Release|Any CPU
45 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|Any CPU.Build.0 = Release|Any CPU
44 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x64.ActiveCfg = Release|x64
46 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x64.ActiveCfg = Release|x64
45 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x64.Build.0 = Release|x64
47 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x64.Build.0 = Release|x64
46 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x86.ActiveCfg = Release|x86
48 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x86.ActiveCfg = Release|x86
47 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x86.Build.0 = Release|x86
49 {8B79FCBE-50DD-40A0-9B5E-E572072E4868}.Release|x86.Build.0 = Release|x86
50 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|Any CPU.Build.0 = Debug|Any CPU
52 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|x64.ActiveCfg = Debug|x64
53 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|x64.Build.0 = Debug|x64
54 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|x86.ActiveCfg = Debug|x86
55 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Debug|x86.Build.0 = Debug|x86
56 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|Any CPU.ActiveCfg = Release|Any CPU
57 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|Any CPU.Build.0 = Release|Any CPU
58 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|x64.ActiveCfg = Release|x64
59 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|x64.Build.0 = Release|x64
60 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|x86.ActiveCfg = Release|x86
61 {CB844F94-E555-4F25-A932-7CB85C98CF86}.Release|x86.Build.0 = Release|x86
48 EndGlobalSection
62 EndGlobalSection
49 GlobalSection(SolutionProperties) = preSolution
63 GlobalSection(SolutionProperties) = preSolution
50 HideSolutionNode = FALSE
64 HideSolutionNode = FALSE
51 EndGlobalSection
65 EndGlobalSection
52 GlobalSection(ExtensibilityGlobals) = postSolution
66 GlobalSection(ExtensibilityGlobals) = postSolution
53 SolutionGuid = {36D837FC-4CDD-4AEA-87BF-F130FEB22E02}
67 SolutionGuid = {36D837FC-4CDD-4AEA-87BF-F130FEB22E02}
54 EndGlobalSection
68 EndGlobalSection
55 EndGlobal
69 EndGlobal
@@ -1,26 +1,26
1 <Project Sdk="Microsoft.NET.Sdk">
1 <Project Sdk="Microsoft.NET.Sdk">
2
2
3 <PropertyGroup>
3 <PropertyGroup>
4 <Authors>Sergey Smirnov</Authors>
4 <Authors>Sergey Smirnov</Authors>
5 <Title>Implab library</Title>
5 <Title>Implab library</Title>
6 <Description>Provides some helper clesses like XML serialization helpers, JSON XML reader,
6 <Description>Provides some helper clesses like XML serialization helpers, JSON XML reader,
7 JSON pull-parser, ECMA-style promises, lightweight synchonization routines Signal
7 JSON pull-parser, ECMA-style promises, lightweight synchonization routines Signal
8 and SharedLock, Trace helpers on top of System.Diagnostics, ObjectPool etc.
8 and SharedLock, Trace helpers on top of System.Diagnostics, ObjectPool etc.
9 </Description>
9 </Description>
10 <Copyright>2012-2018 Sergey Smirnov</Copyright>
10 <Copyright>2012-2018 Sergey Smirnov</Copyright>
11 <Version>3.0.14</Version>
11 <Version>3.0.14</Version>
12 <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl>
12 <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl>
13 <PackageProjectUrl>https://implab.org</PackageProjectUrl>
13 <PackageProjectUrl>https://implab.org</PackageProjectUrl>
14 <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl>
14 <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl>
15 <RepositoryType>mercurial</RepositoryType>
15 <RepositoryType>mercurial</RepositoryType>
16 <PackageTags>IMPLAB;Json pull-parser;Json Xml;async;diagnostics;serialization;</PackageTags>
16 <PackageTags>IMPLAB;Json pull-parser;Json Xml;async;diagnostics;serialization;</PackageTags>
17 <TargetFrameworks>netstandard2.0;net46</TargetFrameworks>
17 <TargetFrameworks>netstandard2.0;net46</TargetFrameworks>
18 <FrameworkPathOverride Condition="'$(TargetFramework)'=='net46' and '$(OSTYPE)'=='linux'">/usr/lib/mono/4.5/</FrameworkPathOverride>
18 <FrameworkPathOverride Condition="'$(TargetFramework)'=='net46' and '$(OSTYPE)'=='linux'">/usr/lib/mono/4.5/</FrameworkPathOverride>
19 <DefineConstants Condition="'$(TargetFramework)'=='net46'">NETFX_TRACE_BUG;$(DefineConstants)</DefineConstants>
19 <DefineConstants Condition="'$(TargetFramework)'=='net46'">NETFX_TRACE_BUG;$(DefineConstants)</DefineConstants>
20 </PropertyGroup>
20 </PropertyGroup>
21
21
22 <ItemGroup>
22 <ItemGroup>
23 <EmbeddedResource Include="Xml\json.xsl"/>
23 <EmbeddedResource Include="src\Xml\json.xsl"/>
24 </ItemGroup>
24 </ItemGroup>
25
25
26 </Project>
26 </Project>
1 NO CONTENT: file renamed from Implab/AbstractEvent.cs to Implab/src/AbstractEvent.cs
NO CONTENT: file renamed from Implab/AbstractEvent.cs to Implab/src/AbstractEvent.cs
1 NO CONTENT: file renamed from Implab/Automaton/AutomatonConst.cs to Implab/src/Automaton/AutomatonConst.cs
NO CONTENT: file renamed from Implab/Automaton/AutomatonConst.cs to Implab/src/Automaton/AutomatonConst.cs
1 NO CONTENT: file renamed from Implab/Automaton/AutomatonTransition.cs to Implab/src/Automaton/AutomatonTransition.cs
NO CONTENT: file renamed from Implab/Automaton/AutomatonTransition.cs to Implab/src/Automaton/AutomatonTransition.cs
1 NO CONTENT: file renamed from Implab/Automaton/DFATable.cs to Implab/src/Automaton/DFATable.cs
NO CONTENT: file renamed from Implab/Automaton/DFATable.cs to Implab/src/Automaton/DFATable.cs
1 NO CONTENT: file renamed from Implab/Automaton/IAlphabet.cs to Implab/src/Automaton/IAlphabet.cs
NO CONTENT: file renamed from Implab/Automaton/IAlphabet.cs to Implab/src/Automaton/IAlphabet.cs
1 NO CONTENT: file renamed from Implab/Automaton/IAlphabetBuilder.cs to Implab/src/Automaton/IAlphabetBuilder.cs
NO CONTENT: file renamed from Implab/Automaton/IAlphabetBuilder.cs to Implab/src/Automaton/IAlphabetBuilder.cs
1 NO CONTENT: file renamed from Implab/Automaton/IDFATable.cs to Implab/src/Automaton/IDFATable.cs
NO CONTENT: file renamed from Implab/Automaton/IDFATable.cs to Implab/src/Automaton/IDFATable.cs
1 NO CONTENT: file renamed from Implab/Automaton/IDFATableBuilder.cs to Implab/src/Automaton/IDFATableBuilder.cs
NO CONTENT: file renamed from Implab/Automaton/IDFATableBuilder.cs to Implab/src/Automaton/IDFATableBuilder.cs
1 NO CONTENT: file renamed from Implab/Automaton/IndexedAlphabetBase.cs to Implab/src/Automaton/IndexedAlphabetBase.cs
NO CONTENT: file renamed from Implab/Automaton/IndexedAlphabetBase.cs to Implab/src/Automaton/IndexedAlphabetBase.cs
1 NO CONTENT: file renamed from Implab/Automaton/MapAlphabet.cs to Implab/src/Automaton/MapAlphabet.cs
NO CONTENT: file renamed from Implab/Automaton/MapAlphabet.cs to Implab/src/Automaton/MapAlphabet.cs
1 NO CONTENT: file renamed from Implab/Automaton/ParserException.cs to Implab/src/Automaton/ParserException.cs
NO CONTENT: file renamed from Implab/Automaton/ParserException.cs to Implab/src/Automaton/ParserException.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/AltToken.cs to Implab/src/Automaton/RegularExpressions/AltToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/AltToken.cs to Implab/src/Automaton/RegularExpressions/AltToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/BinaryToken.cs to Implab/src/Automaton/RegularExpressions/BinaryToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/BinaryToken.cs to Implab/src/Automaton/RegularExpressions/BinaryToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/CatToken.cs to Implab/src/Automaton/RegularExpressions/CatToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/CatToken.cs to Implab/src/Automaton/RegularExpressions/CatToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EmptyToken.cs to Implab/src/Automaton/RegularExpressions/EmptyToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EmptyToken.cs to Implab/src/Automaton/RegularExpressions/EmptyToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EndToken.cs to Implab/src/Automaton/RegularExpressions/EndToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EndToken.cs to Implab/src/Automaton/RegularExpressions/EndToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EndTokenT.cs to Implab/src/Automaton/RegularExpressions/EndTokenT.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/EndTokenT.cs to Implab/src/Automaton/RegularExpressions/EndTokenT.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/ITaggedDFABuilder.cs to Implab/src/Automaton/RegularExpressions/ITaggedDFABuilder.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/ITaggedDFABuilder.cs to Implab/src/Automaton/RegularExpressions/ITaggedDFABuilder.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/IVisitor.cs to Implab/src/Automaton/RegularExpressions/IVisitor.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/IVisitor.cs to Implab/src/Automaton/RegularExpressions/IVisitor.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularDFA.cs to Implab/src/Automaton/RegularExpressions/RegularDFA.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularDFA.cs to Implab/src/Automaton/RegularExpressions/RegularDFA.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularExpressionVisitor.cs to Implab/src/Automaton/RegularExpressions/RegularExpressionVisitor.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularExpressionVisitor.cs to Implab/src/Automaton/RegularExpressions/RegularExpressionVisitor.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularExpressionVisitorT.cs to Implab/src/Automaton/RegularExpressions/RegularExpressionVisitorT.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/RegularExpressionVisitorT.cs to Implab/src/Automaton/RegularExpressions/RegularExpressionVisitorT.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/StarToken.cs to Implab/src/Automaton/RegularExpressions/StarToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/StarToken.cs to Implab/src/Automaton/RegularExpressions/StarToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/SymbolToken.cs to Implab/src/Automaton/RegularExpressions/SymbolToken.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/SymbolToken.cs to Implab/src/Automaton/RegularExpressions/SymbolToken.cs
1 NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/Token.cs to Implab/src/Automaton/RegularExpressions/Token.cs
NO CONTENT: file renamed from Implab/Automaton/RegularExpressions/Token.cs to Implab/src/Automaton/RegularExpressions/Token.cs
1 NO CONTENT: file renamed from Implab/Components/Disposable.cs to Implab/src/Components/Disposable.cs
NO CONTENT: file renamed from Implab/Components/Disposable.cs to Implab/src/Components/Disposable.cs
1 NO CONTENT: file renamed from Implab/Components/DisposablePool.cs to Implab/src/Components/DisposablePool.cs
NO CONTENT: file renamed from Implab/Components/DisposablePool.cs to Implab/src/Components/DisposablePool.cs
1 NO CONTENT: file renamed from Implab/Components/ExecutionState.cs to Implab/src/Components/ExecutionState.cs
NO CONTENT: file renamed from Implab/Components/ExecutionState.cs to Implab/src/Components/ExecutionState.cs
1 NO CONTENT: file renamed from Implab/Components/IAsyncComponent.cs to Implab/src/Components/IAsyncComponent.cs
NO CONTENT: file renamed from Implab/Components/IAsyncComponent.cs to Implab/src/Components/IAsyncComponent.cs
1 NO CONTENT: file renamed from Implab/Components/IFactory.cs to Implab/src/Components/IFactory.cs
NO CONTENT: file renamed from Implab/Components/IFactory.cs to Implab/src/Components/IFactory.cs
1 NO CONTENT: file renamed from Implab/Components/IInitializable.cs to Implab/src/Components/IInitializable.cs
NO CONTENT: file renamed from Implab/Components/IInitializable.cs to Implab/src/Components/IInitializable.cs
1 NO CONTENT: file renamed from Implab/Components/IRunnable.cs to Implab/src/Components/IRunnable.cs
NO CONTENT: file renamed from Implab/Components/IRunnable.cs to Implab/src/Components/IRunnable.cs
1 NO CONTENT: file renamed from Implab/Components/IServiceLocator.cs to Implab/src/Components/IServiceLocator.cs
NO CONTENT: file renamed from Implab/Components/IServiceLocator.cs to Implab/src/Components/IServiceLocator.cs
1 NO CONTENT: file renamed from Implab/Components/LazyAndWeak.cs to Implab/src/Components/LazyAndWeak.cs
NO CONTENT: file renamed from Implab/Components/LazyAndWeak.cs to Implab/src/Components/LazyAndWeak.cs
1 NO CONTENT: file renamed from Implab/Components/ObjectPool.cs to Implab/src/Components/ObjectPool.cs
NO CONTENT: file renamed from Implab/Components/ObjectPool.cs to Implab/src/Components/ObjectPool.cs
1 NO CONTENT: file renamed from Implab/Components/PollingComponent.cs to Implab/src/Components/PollingComponent.cs
NO CONTENT: file renamed from Implab/Components/PollingComponent.cs to Implab/src/Components/PollingComponent.cs
1 NO CONTENT: file renamed from Implab/Components/RunnableComponent.cs to Implab/src/Components/RunnableComponent.cs
NO CONTENT: file renamed from Implab/Components/RunnableComponent.cs to Implab/src/Components/RunnableComponent.cs
1 NO CONTENT: file renamed from Implab/Components/ServiceLocator.cs to Implab/src/Components/ServiceLocator.cs
NO CONTENT: file renamed from Implab/Components/ServiceLocator.cs to Implab/src/Components/ServiceLocator.cs
1 NO CONTENT: file renamed from Implab/Components/StateChangeEventArgs.cs to Implab/src/Components/StateChangeEventArgs.cs
NO CONTENT: file renamed from Implab/Components/StateChangeEventArgs.cs to Implab/src/Components/StateChangeEventArgs.cs
1 NO CONTENT: file renamed from Implab/CustomEqualityComparer.cs to Implab/src/CustomEqualityComparer.cs
NO CONTENT: file renamed from Implab/CustomEqualityComparer.cs to Implab/src/CustomEqualityComparer.cs
1 NO CONTENT: file renamed from Implab/Deferred.cs to Implab/src/Deferred.cs
NO CONTENT: file renamed from Implab/Deferred.cs to Implab/src/Deferred.cs
1 NO CONTENT: file renamed from Implab/Deferred`1.cs to Implab/src/Deferred`1.cs
NO CONTENT: file renamed from Implab/Deferred`1.cs to Implab/src/Deferred`1.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/ActivityScope.cs to Implab/src/Diagnostics/ActivityScope.cs
NO CONTENT: file renamed from Implab/Diagnostics/ActivityScope.cs to Implab/src/Diagnostics/ActivityScope.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/LogicalOperation.cs to Implab/src/Diagnostics/LogicalOperation.cs
NO CONTENT: file renamed from Implab/Diagnostics/LogicalOperation.cs to Implab/src/Diagnostics/LogicalOperation.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/LogicalOperationScope.cs to Implab/src/Diagnostics/LogicalOperationScope.cs
NO CONTENT: file renamed from Implab/Diagnostics/LogicalOperationScope.cs to Implab/src/Diagnostics/LogicalOperationScope.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/SimpleTraceListener.cs to Implab/src/Diagnostics/SimpleTraceListener.cs
NO CONTENT: file renamed from Implab/Diagnostics/SimpleTraceListener.cs to Implab/src/Diagnostics/SimpleTraceListener.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/Trace.cs to Implab/src/Diagnostics/Trace.cs
NO CONTENT: file renamed from Implab/Diagnostics/Trace.cs to Implab/src/Diagnostics/Trace.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceChannel.cs to Implab/src/Diagnostics/TraceChannel.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceChannel.cs to Implab/src/Diagnostics/TraceChannel.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceEventCodes.cs to Implab/src/Diagnostics/TraceEventCodes.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceEventCodes.cs to Implab/src/Diagnostics/TraceEventCodes.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceRegistry.cs to Implab/src/Diagnostics/TraceRegistry.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceRegistry.cs to Implab/src/Diagnostics/TraceRegistry.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceAttribute.cs to Implab/src/Diagnostics/TraceSourceAttribute.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceAttribute.cs to Implab/src/Diagnostics/TraceSourceAttribute.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceChannel.cs to Implab/src/Diagnostics/TraceSourceChannel.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceChannel.cs to Implab/src/Diagnostics/TraceSourceChannel.cs
1 NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceChannel`1.cs to Implab/src/Diagnostics/TraceSourceChannel`1.cs
NO CONTENT: file renamed from Implab/Diagnostics/TraceSourceChannel`1.cs to Implab/src/Diagnostics/TraceSourceChannel`1.cs
1 NO CONTENT: file renamed from Implab/ExceptionHelpers.cs to Implab/src/ExceptionHelpers.cs
NO CONTENT: file renamed from Implab/ExceptionHelpers.cs to Implab/src/ExceptionHelpers.cs
1 NO CONTENT: file renamed from Implab/Formats/ByteAlphabet.cs to Implab/src/Formats/ByteAlphabet.cs
NO CONTENT: file renamed from Implab/Formats/ByteAlphabet.cs to Implab/src/Formats/ByteAlphabet.cs
1 NO CONTENT: file renamed from Implab/Formats/CharAlphabet.cs to Implab/src/Formats/CharAlphabet.cs
NO CONTENT: file renamed from Implab/Formats/CharAlphabet.cs to Implab/src/Formats/CharAlphabet.cs
1 NO CONTENT: file renamed from Implab/Formats/CharMap.cs to Implab/src/Formats/CharMap.cs
NO CONTENT: file renamed from Implab/Formats/CharMap.cs to Implab/src/Formats/CharMap.cs
1 NO CONTENT: file renamed from Implab/Formats/FastInpurScanner.cs to Implab/src/Formats/FastInpurScanner.cs
NO CONTENT: file renamed from Implab/Formats/FastInpurScanner.cs to Implab/src/Formats/FastInpurScanner.cs
1 NO CONTENT: file renamed from Implab/Formats/Grammar.cs to Implab/src/Formats/Grammar.cs
NO CONTENT: file renamed from Implab/Formats/Grammar.cs to Implab/src/Formats/Grammar.cs
1 NO CONTENT: file renamed from Implab/Formats/InputScanner.cs to Implab/src/Formats/InputScanner.cs
NO CONTENT: file renamed from Implab/Formats/InputScanner.cs to Implab/src/Formats/InputScanner.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonElementContext.cs to Implab/src/Formats/Json/JsonElementContext.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonElementContext.cs to Implab/src/Formats/Json/JsonElementContext.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonElementType.cs to Implab/src/Formats/Json/JsonElementType.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonElementType.cs to Implab/src/Formats/Json/JsonElementType.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonGrammar.cs to Implab/src/Formats/Json/JsonGrammar.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonGrammar.cs to Implab/src/Formats/Json/JsonGrammar.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonReader.cs to Implab/src/Formats/Json/JsonReader.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonReader.cs to Implab/src/Formats/Json/JsonReader.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonScanner.cs to Implab/src/Formats/Json/JsonScanner.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonScanner.cs to Implab/src/Formats/Json/JsonScanner.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonStringScanner.cs to Implab/src/Formats/Json/JsonStringScanner.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonStringScanner.cs to Implab/src/Formats/Json/JsonStringScanner.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonTextScanner.cs to Implab/src/Formats/Json/JsonTextScanner.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonTextScanner.cs to Implab/src/Formats/Json/JsonTextScanner.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonTokenType.cs to Implab/src/Formats/Json/JsonTokenType.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonTokenType.cs to Implab/src/Formats/Json/JsonTokenType.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/JsonWriter.cs to Implab/src/Formats/Json/JsonWriter.cs
NO CONTENT: file renamed from Implab/Formats/Json/JsonWriter.cs to Implab/src/Formats/Json/JsonWriter.cs
1 NO CONTENT: file renamed from Implab/Formats/Json/StringTranslator.cs to Implab/src/Formats/Json/StringTranslator.cs
NO CONTENT: file renamed from Implab/Formats/Json/StringTranslator.cs to Implab/src/Formats/Json/StringTranslator.cs
1 NO CONTENT: file renamed from Implab/IDispatcher.cs to Implab/src/IDispatcher.cs
NO CONTENT: file renamed from Implab/IDispatcher.cs to Implab/src/IDispatcher.cs
1 NO CONTENT: file renamed from Implab/IPromise.cs to Implab/src/IPromise.cs
NO CONTENT: file renamed from Implab/IPromise.cs to Implab/src/IPromise.cs
1 NO CONTENT: file renamed from Implab/IPromiseT.cs to Implab/src/IPromiseT.cs
NO CONTENT: file renamed from Implab/IPromiseT.cs to Implab/src/IPromiseT.cs
1 NO CONTENT: file renamed from Implab/IResolvable.cs to Implab/src/IResolvable.cs
NO CONTENT: file renamed from Implab/IResolvable.cs to Implab/src/IResolvable.cs
1 NO CONTENT: file renamed from Implab/IResolvable`1.cs to Implab/src/IResolvable`1.cs
NO CONTENT: file renamed from Implab/IResolvable`1.cs to Implab/src/IResolvable`1.cs
1 NO CONTENT: file renamed from Implab/Messaging/IConsumer.cs to Implab/src/Messaging/IConsumer.cs
NO CONTENT: file renamed from Implab/Messaging/IConsumer.cs to Implab/src/Messaging/IConsumer.cs
1 NO CONTENT: file renamed from Implab/Messaging/IProducer.cs to Implab/src/Messaging/IProducer.cs
NO CONTENT: file renamed from Implab/Messaging/IProducer.cs to Implab/src/Messaging/IProducer.cs
1 NO CONTENT: file renamed from Implab/Parallels/AsyncQueue.cs to Implab/src/Parallels/AsyncQueue.cs
NO CONTENT: file renamed from Implab/Parallels/AsyncQueue.cs to Implab/src/Parallels/AsyncQueue.cs
1 NO CONTENT: file renamed from Implab/Parallels/BlockingQueue.cs to Implab/src/Parallels/BlockingQueue.cs
NO CONTENT: file renamed from Implab/Parallels/BlockingQueue.cs to Implab/src/Parallels/BlockingQueue.cs
1 NO CONTENT: file renamed from Implab/Parallels/DispatchPool.cs to Implab/src/Parallels/DispatchPool.cs
NO CONTENT: file renamed from Implab/Parallels/DispatchPool.cs to Implab/src/Parallels/DispatchPool.cs
1 NO CONTENT: file renamed from Implab/Parallels/SharedLock.cs to Implab/src/Parallels/SharedLock.cs
NO CONTENT: file renamed from Implab/Parallels/SharedLock.cs to Implab/src/Parallels/SharedLock.cs
1 NO CONTENT: file renamed from Implab/Parallels/Signal.cs to Implab/src/Parallels/Signal.cs
NO CONTENT: file renamed from Implab/Parallels/Signal.cs to Implab/src/Parallels/Signal.cs
1 NO CONTENT: file renamed from Implab/Parallels/SimpleAsyncQueue.cs to Implab/src/Parallels/SimpleAsyncQueue.cs
NO CONTENT: file renamed from Implab/Parallels/SimpleAsyncQueue.cs to Implab/src/Parallels/SimpleAsyncQueue.cs
1 NO CONTENT: file renamed from Implab/Parallels/SyncContextDispatcher.cs to Implab/src/Parallels/SyncContextDispatcher.cs
NO CONTENT: file renamed from Implab/Parallels/SyncContextDispatcher.cs to Implab/src/Parallels/SyncContextDispatcher.cs
1 NO CONTENT: file renamed from Implab/Parallels/ThreadPoolDispatcher.cs to Implab/src/Parallels/ThreadPoolDispatcher.cs
NO CONTENT: file renamed from Implab/Parallels/ThreadPoolDispatcher.cs to Implab/src/Parallels/ThreadPoolDispatcher.cs
1 NO CONTENT: file renamed from Implab/Promise.cs to Implab/src/Promise.cs
NO CONTENT: file renamed from Implab/Promise.cs to Implab/src/Promise.cs
1 NO CONTENT: file renamed from Implab/PromiseActionReaction.cs to Implab/src/PromiseActionReaction.cs
NO CONTENT: file renamed from Implab/PromiseActionReaction.cs to Implab/src/PromiseActionReaction.cs
1 NO CONTENT: file renamed from Implab/PromiseActionReaction`1.cs to Implab/src/PromiseActionReaction`1.cs
NO CONTENT: file renamed from Implab/PromiseActionReaction`1.cs to Implab/src/PromiseActionReaction`1.cs
1 NO CONTENT: file renamed from Implab/PromiseAll.cs to Implab/src/PromiseAll.cs
NO CONTENT: file renamed from Implab/PromiseAll.cs to Implab/src/PromiseAll.cs
1 NO CONTENT: file renamed from Implab/PromiseAll`1.cs to Implab/src/PromiseAll`1.cs
NO CONTENT: file renamed from Implab/PromiseAll`1.cs to Implab/src/PromiseAll`1.cs
1 NO CONTENT: file renamed from Implab/PromiseAwaiter.cs to Implab/src/PromiseAwaiter.cs
NO CONTENT: file renamed from Implab/PromiseAwaiter.cs to Implab/src/PromiseAwaiter.cs
1 NO CONTENT: file renamed from Implab/PromiseAwaiter`1.cs to Implab/src/PromiseAwaiter`1.cs
NO CONTENT: file renamed from Implab/PromiseAwaiter`1.cs to Implab/src/PromiseAwaiter`1.cs
1 NO CONTENT: file renamed from Implab/PromiseExecutor.cs to Implab/src/PromiseExecutor.cs
NO CONTENT: file renamed from Implab/PromiseExecutor.cs to Implab/src/PromiseExecutor.cs
1 NO CONTENT: file renamed from Implab/PromiseExecutor`1.cs to Implab/src/PromiseExecutor`1.cs
NO CONTENT: file renamed from Implab/PromiseExecutor`1.cs to Implab/src/PromiseExecutor`1.cs
1 NO CONTENT: file renamed from Implab/PromiseExtensions.cs to Implab/src/PromiseExtensions.cs
NO CONTENT: file renamed from Implab/PromiseExtensions.cs to Implab/src/PromiseExtensions.cs
1 NO CONTENT: file renamed from Implab/PromiseFuncReaction`1.cs to Implab/src/PromiseFuncReaction`1.cs
NO CONTENT: file renamed from Implab/PromiseFuncReaction`1.cs to Implab/src/PromiseFuncReaction`1.cs
1 NO CONTENT: file renamed from Implab/PromiseFuncReaction`2.cs to Implab/src/PromiseFuncReaction`2.cs
NO CONTENT: file renamed from Implab/PromiseFuncReaction`2.cs to Implab/src/PromiseFuncReaction`2.cs
1 NO CONTENT: file renamed from Implab/PromiseHandler.cs to Implab/src/PromiseHandler.cs
NO CONTENT: file renamed from Implab/PromiseHandler.cs to Implab/src/PromiseHandler.cs
1 NO CONTENT: file renamed from Implab/PromiseState.cs to Implab/src/PromiseState.cs
NO CONTENT: file renamed from Implab/PromiseState.cs to Implab/src/PromiseState.cs
1 NO CONTENT: file renamed from Implab/PromiseTransientException.cs to Implab/src/PromiseTransientException.cs
NO CONTENT: file renamed from Implab/PromiseTransientException.cs to Implab/src/PromiseTransientException.cs
1 NO CONTENT: file renamed from Implab/Promise`1.cs to Implab/src/Promise`1.cs
NO CONTENT: file renamed from Implab/Promise`1.cs to Implab/src/Promise`1.cs
1 NO CONTENT: file renamed from Implab/RejectedPromise.cs to Implab/src/RejectedPromise.cs
NO CONTENT: file renamed from Implab/RejectedPromise.cs to Implab/src/RejectedPromise.cs
1 NO CONTENT: file renamed from Implab/RejectedPromise`1.cs to Implab/src/RejectedPromise`1.cs
NO CONTENT: file renamed from Implab/RejectedPromise`1.cs to Implab/src/RejectedPromise`1.cs
1 NO CONTENT: file renamed from Implab/ResolvedPromise.cs to Implab/src/ResolvedPromise.cs
NO CONTENT: file renamed from Implab/ResolvedPromise.cs to Implab/src/ResolvedPromise.cs
1 NO CONTENT: file renamed from Implab/ResolvedPromise`1.cs to Implab/src/ResolvedPromise`1.cs
NO CONTENT: file renamed from Implab/ResolvedPromise`1.cs to Implab/src/ResolvedPromise`1.cs
1 NO CONTENT: file renamed from Implab/Safe.cs to Implab/src/Safe.cs
NO CONTENT: file renamed from Implab/Safe.cs to Implab/src/Safe.cs
1 NO CONTENT: file renamed from Implab/TaskHelpers.cs to Implab/src/TaskHelpers.cs
NO CONTENT: file renamed from Implab/TaskHelpers.cs to Implab/src/TaskHelpers.cs
1 NO CONTENT: file renamed from Implab/Xml/JsonXmlCaseTransform.cs to Implab/src/Xml/JsonXmlCaseTransform.cs
NO CONTENT: file renamed from Implab/Xml/JsonXmlCaseTransform.cs to Implab/src/Xml/JsonXmlCaseTransform.cs
1 NO CONTENT: file renamed from Implab/Xml/JsonXmlReader.cs to Implab/src/Xml/JsonXmlReader.cs
NO CONTENT: file renamed from Implab/Xml/JsonXmlReader.cs to Implab/src/Xml/JsonXmlReader.cs
1 NO CONTENT: file renamed from Implab/Xml/JsonXmlReaderOptions.cs to Implab/src/Xml/JsonXmlReaderOptions.cs
NO CONTENT: file renamed from Implab/Xml/JsonXmlReaderOptions.cs to Implab/src/Xml/JsonXmlReaderOptions.cs
1 NO CONTENT: file renamed from Implab/Xml/JsonXmlReaderPosition.cs to Implab/src/Xml/JsonXmlReaderPosition.cs
NO CONTENT: file renamed from Implab/Xml/JsonXmlReaderPosition.cs to Implab/src/Xml/JsonXmlReaderPosition.cs
1 NO CONTENT: file renamed from Implab/Xml/SerializationHelpers.cs to Implab/src/Xml/SerializationHelpers.cs
NO CONTENT: file renamed from Implab/Xml/SerializationHelpers.cs to Implab/src/Xml/SerializationHelpers.cs
1 NO CONTENT: file renamed from Implab/Xml/SerializersPool.cs to Implab/src/Xml/SerializersPool.cs
NO CONTENT: file renamed from Implab/Xml/SerializersPool.cs to Implab/src/Xml/SerializersPool.cs
1 NO CONTENT: file renamed from Implab/Xml/XmlDefaultSerializer.cs to Implab/src/Xml/XmlDefaultSerializer.cs
NO CONTENT: file renamed from Implab/Xml/XmlDefaultSerializer.cs to Implab/src/Xml/XmlDefaultSerializer.cs
1 NO CONTENT: file renamed from Implab/Xml/XmlNameContext.cs to Implab/src/Xml/XmlNameContext.cs
NO CONTENT: file renamed from Implab/Xml/XmlNameContext.cs to Implab/src/Xml/XmlNameContext.cs
1 NO CONTENT: file renamed from Implab/Xml/XmlSerializerExtensions.cs to Implab/src/Xml/XmlSerializerExtensions.cs
NO CONTENT: file renamed from Implab/Xml/XmlSerializerExtensions.cs to Implab/src/Xml/XmlSerializerExtensions.cs
1 NO CONTENT: file renamed from Implab/Xml/XmlSimpleAttribute.cs to Implab/src/Xml/XmlSimpleAttribute.cs
NO CONTENT: file renamed from Implab/Xml/XmlSimpleAttribute.cs to Implab/src/Xml/XmlSimpleAttribute.cs
1 NO CONTENT: file renamed from Implab/Xml/XmlToJson.cs to Implab/src/Xml/XmlToJson.cs
NO CONTENT: file renamed from Implab/Xml/XmlToJson.cs to Implab/src/Xml/XmlToJson.cs
1 NO CONTENT: file renamed from Implab/Xml/json.xsl to Implab/src/Xml/json.xsl
NO CONTENT: file renamed from Implab/Xml/json.xsl to Implab/src/Xml/json.xsl
1 NO CONTENT: file renamed from Implab/Xml/readme.txt to Implab/src/Xml/readme.txt
NO CONTENT: file renamed from Implab/Xml/readme.txt to Implab/src/Xml/readme.txt
General Comments 3
Under Review
author

Auto status change to "Under Review"

Approved
author

ok, latest stable version should be in default

You need to be logged in to leave comments. Login now