From bf039e2ddea058cf6536895185e7c95ba2fbafab Mon Sep 17 00:00:00 2001 From: Ogoun Date: Fri, 13 Dec 2019 17:49:32 +0300 Subject: [PATCH] Configuration bind Append configset Bind --- ConfigurationTests/AppConfig.cs | 3 +- ConfigurationTests/Program.cs | 27 +++----- ConfigurationTests/config.ini | 5 +- .../Services/Collections/CollectionFactory.cs | 3 - .../Services/Config/BaseConfiguration.cs | 66 +++++++++++++++++-- .../Services/Config/BaseConfigurationSet.cs | 13 +++- ZeroLevel/Services/Config/IConfiguration.cs | 1 + ZeroLevel/ZeroLevel.csproj | 10 +-- 8 files changed, 91 insertions(+), 37 deletions(-) diff --git a/ConfigurationTests/AppConfig.cs b/ConfigurationTests/AppConfig.cs index a959cee..781c7bf 100644 --- a/ConfigurationTests/AppConfig.cs +++ b/ConfigurationTests/AppConfig.cs @@ -7,8 +7,9 @@ namespace ConfigurationTests public string Url; public int BatchSize; public IEnumerable Sheme; - public IEnumerable Port; + public int[] Port; public ServiceConfig Service; + public IEnumerable List; } public class ServiceConfig diff --git a/ConfigurationTests/Program.cs b/ConfigurationTests/Program.cs index 1719ba2..2143611 100644 --- a/ConfigurationTests/Program.cs +++ b/ConfigurationTests/Program.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; using ZeroLevel; namespace ConfigurationTests @@ -10,21 +8,7 @@ namespace ConfigurationTests static void Main(string[] args) { - var list = new List(); - for (int i = 0; i < 100; i++) - { - list.Add(i); - } - var collection = list.Chunkify(6).ToList(); - foreach (var t in collection) - { - Console.WriteLine(string.Join("; ", t.Select(n => n.ToString("D2")))); - } - Console.ReadKey(); - return; - - - var config = Configuration.ReadFromIniFile("config.ini").Bind(); + var config = Configuration.ReadSetFromIniFile("config.ini").Bind(); Console.WriteLine(config.Url); Console.WriteLine(config.BatchSize); Console.WriteLine("Ports"); @@ -37,7 +21,16 @@ namespace ConfigurationTests { Console.WriteLine($"\t{sheme}"); } + Console.WriteLine($"Range list: {string.Join(", ", config.List)}"); + + Console.WriteLine("Service"); + Console.WriteLine($"\tAppKey: {config.Service.AppKey}"); + Console.WriteLine($"\tAppName: {config.Service.AppName}"); + Console.WriteLine($"\tServiceGroup: {config.Service.ServiceGroup}"); + Console.WriteLine($"\tServiceType: {config.Service.ServiceType}"); + Console.ReadKey(); } } } + diff --git a/ConfigurationTests/config.ini b/ConfigurationTests/config.ini index 97392c2..a3518a0 100644 --- a/ConfigurationTests/config.ini +++ b/ConfigurationTests/config.ini @@ -6,9 +6,10 @@ sheme=https port=80 port=90 port=8800 +list=1-5,7,9 [service] AppName=TestApp AppKey=test.app -ServiceGroup=seo -ServiceType=site \ No newline at end of file +ServiceGroup=System +ServiceType=service \ No newline at end of file diff --git a/ZeroLevel/Services/Collections/CollectionFactory.cs b/ZeroLevel/Services/Collections/CollectionFactory.cs index f5bbde0..20afc8a 100644 --- a/ZeroLevel/Services/Collections/CollectionFactory.cs +++ b/ZeroLevel/Services/Collections/CollectionFactory.cs @@ -65,9 +65,6 @@ namespace ZeroLevel.Services.Collections private class ArrayBuilder : IArrayBuilder { - private readonly IInvokeWrapper _wrapper; - - private readonly Invoker _insert; private readonly object _instance; public ArrayBuilder(Type entityType, int count) diff --git a/ZeroLevel/Services/Config/BaseConfiguration.cs b/ZeroLevel/Services/Config/BaseConfiguration.cs index a82fa26..474298b 100644 --- a/ZeroLevel/Services/Config/BaseConfiguration.cs +++ b/ZeroLevel/Services/Config/BaseConfiguration.cs @@ -463,10 +463,11 @@ namespace ZeroLevel.Services.Config } } - public T Bind() + public T Bind() => (T)Bind(typeof(T)); + public object Bind(Type type) { - var mapper = TypeMapper.Create(true); - var instance = (T)TypeHelpers.CreateInitialState(typeof(T)); + var mapper = TypeMapper.Create(type, true); + var instance = TypeHelpers.CreateInitialState(type); mapper.TraversalMembers(member => { if (Contains(member.Name)) @@ -476,7 +477,33 @@ namespace ZeroLevel.Services.Config { case 0: return; case 1: // field - member.Setter(instance, First(member.Name)); + if (TypeHelpers.IsArray(member.ClrType)) + { + var itemType = member.ClrType.GetElementType(); + var elements = SplitRange(First(member.Name), itemType).ToArray(); + var arrayBuilder = CollectionFactory.CreateArray(itemType, elements.Length); + int index = 0; + foreach (var item in elements) + { + arrayBuilder.Set(item, index); + index++; + } + member.Setter(instance, arrayBuilder.Complete()); + } + else if (TypeHelpers.IsEnumerable(member.ClrType) && member.ClrType != typeof(string)) + { + var itemType = member.ClrType.GenericTypeArguments.First(); + var collectionBuilder = CollectionFactory.Create(itemType); + foreach (var item in SplitRange(First(member.Name), itemType)) + { + collectionBuilder.Append(item); + } + member.Setter(instance, collectionBuilder.Complete()); + } + else + { + member.Setter(instance, First(member.Name)); + } break; default: // array, or first if (TypeHelpers.IsArray(member.ClrType)) @@ -526,5 +553,34 @@ namespace ZeroLevel.Services.Config }); return instance; } + private static IEnumerable SplitRange(string line, Type elementType) + { + if (string.IsNullOrWhiteSpace(line)) yield return StringToTypeConverter.TryConvert(line, elementType); + foreach (var part in line.Split(',')) + { + if (part.IndexOf('-') >= 0) + { + var lr = part.Split('-'); + if (lr.Length == 2) + { + long left = (long)Convert.ChangeType(StringToTypeConverter.TryConvert(lr[0], elementType), typeof(long)); + long right = (long)Convert.ChangeType(StringToTypeConverter.TryConvert(lr[1], elementType), typeof(long)); + for (; left <= right; left++) + { + yield return Convert.ChangeType(left, elementType); + } + } + else + { + // incorrect string + yield break; + } + } + else + { + yield return StringToTypeConverter.TryConvert(part, elementType); + } + } + } } -} \ No newline at end of file +} diff --git a/ZeroLevel/Services/Config/BaseConfigurationSet.cs b/ZeroLevel/Services/Config/BaseConfigurationSet.cs index 3aacf2a..ac3c20c 100644 --- a/ZeroLevel/Services/Config/BaseConfigurationSet.cs +++ b/ZeroLevel/Services/Config/BaseConfigurationSet.cs @@ -2,6 +2,8 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; +using ZeroLevel.Services.ObjectMapping; +using ZeroLevel.Services.Reflection; using ZeroLevel.Services.Serialization; namespace ZeroLevel.Services.Config @@ -260,7 +262,16 @@ namespace ZeroLevel.Services.Config public T Bind() { - return default; + var mapper = TypeMapper.Create(true); + var instance = Default.Bind(); + mapper.TraversalMembers(member => + { + if (ContainsSection(member.Name)) + { + member.Setter(instance, GetSection(member.Name).Bind(member.ClrType)); + } + }); + return instance; } } } \ No newline at end of file diff --git a/ZeroLevel/Services/Config/IConfiguration.cs b/ZeroLevel/Services/Config/IConfiguration.cs index fb986af..e57be37 100644 --- a/ZeroLevel/Services/Config/IConfiguration.cs +++ b/ZeroLevel/Services/Config/IConfiguration.cs @@ -143,5 +143,6 @@ namespace ZeroLevel void CopyTo(IConfiguration config); T Bind(); + object Bind(Type type); } } \ No newline at end of file diff --git a/ZeroLevel/ZeroLevel.csproj b/ZeroLevel/ZeroLevel.csproj index f82b8db..931a995 100644 --- a/ZeroLevel/ZeroLevel.csproj +++ b/ZeroLevel/ZeroLevel.csproj @@ -39,15 +39,9 @@ Append DumpStorage (fast temporary journal) - - + + - - - C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.win32.registry\4.5.0\ref\netstandard2.0\Microsoft.Win32.Registry.dll - - -