рдкреГрд╖реНрдарднреВрдорд┐
рд╣рдорд╛рд░реА рдХрдВрдкрдиреА, рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╕реЗрд╡рд╛рдУрдВ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ - 12) рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреИрдХреЗрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдПрдХ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рддреА рд╣реИред
рдореИрдВ рдЗрди рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ * nix-OS рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Windows- рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ .NET рдорд╛рдирдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред
рдЕрдВрддрд┐рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХреБрдЫ рд▓рд┐рдЧреЗрд╕реА-рдХреЛрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ .NET рдорд╛рдирдХ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ XML рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕реЗ, System.Configuration рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЙрд╕реА рд╕рдордп, рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ XML-configs рдореЗрдВ рд╣рдордиреЗ рд╕рдордп-рд╕рдордп рдкрд░ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВ рдЬрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓рддреЗ рд╕рдордп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рд╣рдо рд╕рдорд╛рдкрди рдЯреИрдЧ рдХреЛ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рд░рдЦ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди System.Xml XML-configs рдХрд╛ рдПрдХ рдЕрджреНрднреБрдд рдкрд╛рдардХред XmlDocument рдЪреБрдкрдЪрд╛рдк рдРрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдирд┐рдЧрд▓ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдЯреНрд░реЗрдВрдбреА YAML рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдореЗрдВ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛? рдЗрд╕ рд▓реЗрдЦ рдореЗрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
рд╣рдо XML рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ
рд╣рдо XML рдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдореЗрдВ .NET рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ AppSettings.cs рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
[System.Configuration.SettingsProvider(typeof(PortableSettingsProvider))] internal sealed partial class AppSettings : IServerManagerConfigStorage, IWebSettingsStorage, IServerSettingsStorage, IGraphiteAddressStorage, IDatabaseConfigStorage, IBlackListStorage, IKeyCloackConfigFilePathProvider, IPrometheusSettingsStorage, IMetricsConfig { }
рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рддрдХрдиреАрдХ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдбреАрдЖрдИ рдХрдВрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреА рд╣реИред
рднрдВрдбрд╛рд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рднреА рдореБрдЦреНрдп рдЬрд╛рджреВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ PortableSettingsProvider (рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦреЗрдВ), рд╕рд╛рде рд╣реА рдбрд┐рдЬрд╛рдЗрдирд░ рдлрд╝рд╛рдЗрд▓ AppSettings.Designer.cs рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ:
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class AppSettings : global::System.Configuration.ApplicationSettingsBase { private static AppSettings defaultInstance = ((AppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AppSettings()))); public static AppSettings Default { get { return defaultInstance; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("35016")] public int ListenPort { get { return ((int)(this["ListenPort"])); } set { this["ListenPort"] = value; } } ...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, "рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ" рдЙрди рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдЗрд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣рдорд╛рд░реЗ рдкреЛрд░реНрдЯреЗрдмрд▓рд╕рд┐рдЯрд┐рдВрдЧреНрд╕рдкреНрд░реЙрдЗрдбрд░ рдХреНрд▓рд╛рд╕, рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рд░реАрдбрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯрд┐рдВрдЧрд╕реЗрдЯрд╡рд┐рдкрд░реНрд╕ рдореЗрдВ рдРрдкрд╕реЗрдЯрд┐рдВрдЧ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
XML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╣рдо рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВ):
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup"> <section name="MetricServer.Properties.Settings" type="System.Configuration.ClientSettingsSection" /> </sectionGroup> </configSections> <userSettings> <MetricServer.Properties.Settings> <setting name="MCXSettings" serializeAs="String"> <value>Inactive, ChartLen: 1000, PrintLen: 50, UseProxy: False</value> </setting> <setting name="KickUnknownAfter" serializeAs="String"> <value>00:00:10</value> </setting> ... </MetricServer.Properties.Settings> </userSettings> </configuration>
рдХреНрдпрд╛ YAML рдлрд╝рд╛рдЗрд▓реЗрдВ рдореИрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
VirtualFeed: MaxChartHistoryLength: 10 Port: 35016 UseThrottling: True ThrottlingIntervalMs: 50000 UseHistoryBroadcast: True CalendarName: "EmptyCalendar" UsMarketFeed: UseImbalances: True
рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдорд╕реНрдпрд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, XML рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди "рдлреНрд▓реИрдЯ" рд╣реИрдВ, рд▓реЗрдХрд┐рди YAML рдореЗрдВ рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ (рдЕрдиреБрднрд╛рдЧ рдФрд░ рдЙрдкрдЦрдВрдб рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ)ред рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред XML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рд░реНрд╕рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рдлреНрд▓реИрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд░реЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
<setting name="MCXSettings" serializeAs="String"> <value>Inactive, ChartLen: 1000, PrintLen: 50, UseProxy: False</value> </setting>
рдореИрдВ YAML рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдорди рдирд╣реАрдВ рдХрд░рддрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдо AppSettings рд╡рд░реНрдЧ рдХреА рдореМрдЬреВрджрд╛ "рдлреНрд▓реИрдЯ" рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИрдВ: рдЗрд╕рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдПрдХ рдвреЗрд░ рдореЗрдВ рдвреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ, рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░
рдХреЗ рдХреЙрдиреНрдлрд┐рдЧреНрд░реЗрд╢рди рдПрдХ рд╕реНрдерд┐рд░ рдореЛрдиреЛрд▓рд┐рде рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд╣реА рд╕рдордп рдкрд░ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ, рдордХреНрдЦреА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, XML рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ AppSettings рдХреЛ INotifyPropertyChanged рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ AppSettings рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЧреБрдг рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ System.Configuration.ApplicationSettingsBase рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ INotifyPropertyChangedред рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ YAML рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреАрд╕рд░рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ: рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рджреВрд╕рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд╛рд▓реЗред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рд╕реБрдирдХрд░ рдФрд░ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЙрдкреА рди рдХрд░рдирд╛ рдкрдбрд╝реЗред
рдФрд░ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ - рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рди рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдкрд╕реЗрдЯреНрд╕ рдбреАрдлреЙрд▓реНрдЯ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд╕реЗ рднреА рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдПрдВ рдХрд┐ рдпрд╣ рдмреИрдХрд╕реНрдЯреЗрдЬ AppSettings.Designer.cs рдореЗрдВ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
private static AppSettings defaultInstance = ((AppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AppSettings()))); public static AppSettings Default { get { return defaultInstance; } }
рдкреВрд░реНрд╡рдЧрд╛рдореА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, AppSettings рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдирд┐рд░реНрдгрдп
рдЙрдкрдХрд░рдг
рдкреНрд░рддреНрдпрдХреНрд╖ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, YAML рдиреЗ NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
- рдпрдорд▓рдбреЙрдЯрдиреЗрдЯ - github.com/aaubry/YamlDotNet рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рд╡рд░рдг (рдЕрдиреБрд╡рд╛рдж) рд╕реЗ:
YamlDotNet YAML рдХреЗ рд▓рд┐рдП .NET рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред YamlDotNet рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкрд╛рд░реНрд╕рд░ рдФрд░ YAML рдЬрдирд░реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рднреА рд╣реИ рдЬреЛ Xmlidocument рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдХреНрд░рдордмрджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ / YAML рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- NetEscapades.Configuration - github.com/andrewlock/NetEscapades.Configuration ред рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рддрд╛ рд╣реИ (Microsoft.Extensions.Configuration.IConfigurationSource рдХреЗ рдЕрд░реНрде рдореЗрдВ, рдЬреЛ ASP.NET рдХреЛрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬреЛ рдпрдорд▓реЛрдЯ рдбреЙрдЯрдиреЗрдЯ рдХреЗ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред
рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред
YAML рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг
рд╕рдВрдХреНрд░рдордг рдХреЛ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдкрд╣рд▓реЗ рддреЛ рд╣рдордиреЗ XML рд╕реЗ рдХреЗрд╡рд▓ YAML рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдПрдХ рдлреНрд▓реИрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП, рдФрд░ рдлрд┐рд░ рд╣рдордиреЗ YAML рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ред рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдмрд╕ рдпрд╣реА рдХрд░реВрдВрдЧрд╛ред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ YML рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ YAML рдлрд╛рдЗрд▓ рдЦреБрдж рддреИрдпрд╛рд░ рдХрд░рдиреА рд╣реЛрдЧреАред рд╣рдо рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо рдХрд╣рддреЗ рд╣реИрдВ (рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдЖрдкрд╕ рдореЗрдВ рдЙрдирдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЬрдбрд╝ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ, AppSettings рдХреЗ рдмрдЧрд▓ рдореЗрдВ:

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, YML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдПрдХ "рдлреНрд▓реИрдЯ" рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ:
VirtualFeed: "MaxChartHistoryLength: 10, UseThrottling: True, ThrottlingIntervalMs: 50000, UseHistoryBroadcast: True, CalendarName: EmptyCalendar" VirtualFeedPort: 35016 UsMarketFeedUseImbalances: True
рд╕реЗрдЯрд┐рдВрдЧ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде AppSettings рднрд░рдирд╛
рд╣рдо AppSettings.Designer.cs рд╕реЗ AppSettings.cs рд╕реЗ рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рд╢рд╛рдирджрд╛рд░ рдЧреБрдгреЛрдВ рдФрд░ рдХреЛрдб / рд╕реЗрдЯ-рдкрд╛рд░реНрдЯреНрд╕ рдореЗрдВ рдЦреБрдж рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рдерд╛:
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("35016")] public int VirtualFeedPort{ get { return ((int)(this["VirtualFeedPort"])); } set { this["VirtualFeedPort"] = value; } }
рдпрд╣ рдмрди рдЧрдпрд╛:
public int VirtualFeedPort { get; set; }
рд╣рдо AppSettings
.Designer рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВред рдЕрдм, рд╡реИрд╕реЗ, рдЖрдк рдРрдк рдореЗрдВ рдпреВрдЬрд╝рд░рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╛рдЗрд▓ рдореЗрдВ, рдЕрдЧрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реИ - рддреЛ рд╡рд╣реАрдВ рдбрд┐рдлреЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реНрдЯреЛрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЧреЗ рдмрдврд╝реЛред
рдордХреНрдЦреА рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдРрдкрд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ INotifyPropertyChanged рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдзрд╛рд░ System.Configuration.ApplicationSettingsBase рдЕрдм рдХреНрд░рдорд╢рдГ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреА рдЬрд╛рджреВ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЖрдк рдЗрд╕реЗ "рдорд╛рдереЗ рдкрд░" рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдирд╛ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕реЗрдЯрд░ рдореЗрдВ рдмреБрд▓рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рдХреЛрдб рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдХреЙрдкреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдЪрд▓реЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдХрд░рддреЗ рд╣реИрдВ - рд╕рд╣рд╛рдпрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдСрдЯреЛрдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ, рдЬреИрд╕реЗ рдХрд┐ System.Configuration.ApplicationSettingsBase рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛:
рдпрд╣рд╛рдВ, [CallerMemberName] рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рдХреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд AppSettingsред
рдЕрдм рд╣рдо рдЗрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ AutoNotifier рд╕реЗ рдЕрдкрдиреА AppSettings рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реИ:
public int VirtualFeedPort { get { return Get<int>(); } set { Set(value); } }
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ AppSettings рдХрдХреНрд╖рд╛рдПрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдХреЙрдореНрдкреИрдХреНрдЯ рджрд┐рдЦрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ INotifyPropertyChanged рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред
рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Castle.DynamicProxy.IInterceptor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рджреВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░реЛрдХрдирд╛ рдФрд░ рд╡рд╣рд╛рдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рдирд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рдлреИрд╕рд▓рд╛ рдореБрдЭреЗ рдмрд╣реБрдд рднрд╛рд░реА рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рдПрдХ YAML рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧ рдкрдврд╝рдирд╛
рдЕрдЧрд▓рд╛ рдХрджрдо рдпреБрдХрдорд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд░реАрдбрд░ рдХреЛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣ рд╕реЗрд╡рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдХрд░реАрдм рдХрд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рдЕрдзреАрди рд╡рд┐рд╖рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ:
public static IServerConfigurationProvider LoadServerConfiguration(IReadOnlyDictionary<Type, string> allSections) { IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(ConfigFiles.BasePath); foreach (string configFile in configFiles) { string directory = Path.GetDirectoryName(configFile); if (!string.IsNullOrEmpty(directory))
рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдирдмреНрдпреВрд▓рд░ рд╕рдВрднрд╡рддрдГ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрд╛ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо ASP.NET рдХреЛрд░ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБ рд░реБрдЪрд┐ рдХреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╣рдореЗрдВ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред рдпрд╣ рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рдХрдо рд╕реЗ рдХрдо рджреЛ рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реЗ, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд ServerConfigurationProvider рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрдврд╝рд╛ рд╣реБрдЖ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ?
YAML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ
рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдЕрдм рдПрдХ YML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, YML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдореЗрдВ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
VirtualFeed: MaxChartHistoryLength: 10 Port: 35016 UseThrottling: True ThrottlingIntervalMs: 50000 UseHistoryBroadcast: True CalendarName: "EmptyCalendar" UsMarketFeed: UseImbalances: True
рдЕрдм рдЖрдЗрдП AppSettings рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рд╕рд┐рдЦрд╛рдПрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
public sealed class AppSettings : AutoNotifier, IWebSettingsStorage, IServerSettingsStorage, IServerManagerAddressStorage, IGlobalCredentialsStorage, IGraphiteAddressStorage, IDatabaseConfigStorage, IBlackListStorage, IKeyCloackConfigFilePathProvider, IPrometheusSettingsStorage, IHeartBeatConfig, IConcurrentAcceptorProperties, IMetricsConfig { public static IReadOnlyDictionary<Type, string> Sections { get; } = new Dictionary<Type, string> { {typeof(IDatabaseConfigStorage), "Database"}, {typeof(IWebSettingsStorage), "Web"}, {typeof(IServerSettingsStorage), "Server"}, {typeof(IConcurrentAcceptorProperties), "ConcurrentAcceptor"}, {typeof(IGraphiteAddressStorage), "Graphite"}, {typeof(IKeyCloackConfigFilePathProvider), "Keycloak"}, {typeof(IPrometheusSettingsStorage), "Prometheus"}, {typeof(IHeartBeatConfig), "Heartbeat"}, {typeof(IServerManagerAddressStorage), "ServerManager"}, {typeof(IGlobalCredentialsStorage), "GlobalCredentials"}, {typeof(IBlackListStorage), "Blacklist"}, {typeof(IMetricsConfig), "Metrics"} }; ...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рд╕реАрдзреЗ AppSettings рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ AppSettings рд╡рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдорд╛рди рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдкреНрд░рдореБрдЦ рд╣реИрдВред рдЕрдм рд╣рдо YML рдлрд╛рдЗрд▓ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рддреБрд▓рдирд╛ AppSettings рдореЗрдВ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛)ред
рд╣рдо рдпрд╣реАрдВ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - AppSettings рдореЗрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдлреИрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЬрдЧрд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдореЗрдВ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ AppSettings рдореЗрдВ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЕрдиреБрднрд╛рдЧред
рдпрджрд┐ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдЬреАрдм рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдРрд╕рд╛ рдерд╛, рдЬрдм рд╣рдо рдмрд┐рдирд╛ XML, YAML рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдП рдмрд┐рдирд╛, XML рд╕реЗ YAML рдореЗрдВ рдмрджрд▓ рдЧрдПред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд░реНрдЧреЛрдВ рдХреА рдпрд╣ рдкреВрд░реА рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ ServerConfigurationProvider рдЕрдзрд┐рдХ рд╕рд░рд▓ (рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ) рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдПрдХ рдлреНрд▓реИрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ AppSettings.Default рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AppSettings рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
public static AppSettings Default { get; } public AppSettings() { Default = this; }
рдЕрдм рд╣рдо AppSettings.Default (рдмрд╢рд░реНрддреЗ рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА IConfigurationRoot рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ServerConfigurationProvider рдореЗрдВ рдкрдврд╝ рдЪреБрдХреЗ рд╣реЛрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░, AppSettings рдХреЛ рддрддреНрдХрд╛рд▓ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╣рд░ рдЬрдЧрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдПрдХ рдлреНрд▓реИрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рддреЛ, рд╡реИрд╕реЗ рднреА, рдЖрдкрдХреЛ рдХреЛрдб рд╕реЗ рд╣рд░ рдЬрдЧрд╣ AppSettings.Default рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХреНрдпреЛрдВ - рдпрд╣ рдЖрдЧреЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
ServerConfigurationProvider
рд╡рд┐рд╢реЗрд╖ ServerConfigurationProvider рд╡рд░реНрдЧ рдиреЗ рдмрд╣реБрдд рд╣реА рдЬрд╛рджреВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлреНрд▓реИрдЯ AppSettings рдХреЗ рд╕рд╛рде рдирдП рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд YAML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддреЛ рдпрд╣ рд╣реИ
рдкреВрд░реНрдг ServerConfigurationProvider рдХреЛрдб ServerConfigurationProvider AppSettings рд╕реЗрдЯрд┐рдВрдЧ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░рд┐рдд рд╣реИ:
public class ServerConfigurationProvider<TAppSettings> : IServerConfigurationProvider where TAppSettings : new()
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд░реАрдб рд╕реНрд╡рдпрдВ (IConfigurationRoot) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧ рд╢рдмреНрджрдХреЛрд╢ (AppSettings.Sections) рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рд╣реИ (рдХреНрдпрд╛ рд╣рдо рд╡рд╛рдИрдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рддреБрд░рдВрдд рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?):
_configuration.GetReloadToken()?.RegisterChangeCallback(OnConfigurationFileChanged, null); ... private void OnConfigurationFileChanged(object _) { foreach (string sectionName in _cachedSections.Keys) { Type sectionInterface = _interfacesBySections[sectionName]; TAppSettings newSection = ReadSection(sectionName, sectionInterface); TAppSettings oldSection; if (_cachedSections.TryGetValue(sectionName, out oldSection)) { UpdateSection(oldSection, newSection); } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ, YML рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрди рд╕рднреА рдЕрдиреБрднрд╛рдЧреЛрдВ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрджрд┐ рдЕрдиреБрднрд╛рдЧ рдХреИрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдкрдврд╝рд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ (рдпрд╛рдиреА, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рддреЛ рд╣рдо рдХреИрд╢ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХреНрдпреЛрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреИрд╢ рдореЗрдВ рд╣реИрдВ (рдпрд╛рдиреА рдорд╛рдВрдЧ рдХреА рдЧрдИ)? рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╣рдордиреЗ рд╕рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдЧрд▓рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдЕрд▓рд░реНрдЯ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓реЙрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рд╕рднреА рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рддреБрд░рдВрдд рдкрдврд╝рддреЗ рд╣реИрдВред
рдХреИрд╢ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдорд╛рдиреЛрдВ рдХреЛ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рдорд╛рдореВрд▓реА рд╣реИ:
private void UpdateSection(TAppSettings oldConfig, TAppSettings newConfig) { foreach (PropertyInfo propertyInfo in typeof(TAppSettings).GetProperties().Where(p => p.GetMethod != null && p.SetMethod != null)) { propertyInfo.SetValue(newConfig, propertyInfo.GetValue(oldConfig)); } }
рд▓реЗрдХрд┐рди рдкрдврд╝рдирд╛ рдЕрдиреБрднрд╛рдЧ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ:
private TAppSettings ReadSection(string sectionName, Type sectionInterface) { TAppSettings parsed; try { IConfigurationSection section = _configuration.GetSection(sectionName); CheckSection(section, sectionName, sectionInterface); parsed = section.Get<TAppSettings>(); if (parsed == null) {
рдпрд╣рд╛рдВ рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдорд╛рдирдХ IConfigurationRoot.GetSection рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВред - .
: section.Get YAML- тАФ ( , .. ) , .
:
VirtualFeed: Names: []
VirtualFeed Names , YAML-, , , VirtualFeed . рдпрд╣ рджреБрдЦрдж рд╣реИред
IEnumerable- . ┬л ┬╗ .
ReadArrays(parsed, section); ...
, , IEnumerable ┬л┬╗, . : -? тАФ , , -, . , ( ) IConfigurationSection, . - .
ReadSection : FindSection.
[CanBeNull] public object FindSection(Type sectionInterface) { string sectionName = FindSectionName(sectionInterface); if (sectionName == null) { return null; }
, , AppSettings.Default: ( ) FindSection AppSettings, , , , AppSettings.Default, , ( тАФ NULL 0).
:
private void CheckSection(IConfigurationSection section, string sectionName, Type sectionInterface) { ICollection<PropertyInfo> properties = GetPublicProperties(sectionInterface, needSetters: false); var configProperties = new HashSet<string>(section.GetChildren().Select(c => c.Key)); foreach (PropertyInfo propertyInfo in properties) { if (!configProperties.Remove(propertyInfo.Name)) { if (propertyInfo.PropertyType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType)) {
( тАФ ). : , , , - . , - . , , .. , , , .
тАФ , ┬л--┬╗? , , , , тАФ , , . , , . , , .
GetPublicProperties, , , . , , , , , , , , , .
:
тАФ FindSection тАФ . рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
IThreadPoolProperties threadPoolProperties = ConfigurationProvider.FindSection<IThreadPoolProperties>();
тАФ .
IoC- Castle Windsor. . , .
Extension-, , :
public static class ServerConfigurationProviderExtensions { public static void RegisterAllConfigurationSections(this IWindsorContainer container, IServerConfigurationProvider configurationProvider) { Register(container, configurationProvider, configurationProvider.AllSections.ToArray()); } public static void Register(this IWindsorContainer container, IServerConfigurationProvider configurationProvider, params Type[] configSections) { var registrations = new IRegistration[configSections.Length]; for (int i = 0; i < registrations.Length; i++) { Type configSection = configSections[i]; object section = configurationProvider.FindSection(configSection); registrations[i] = Component.For(configSection).Instance(section).Named(configSection.FullName); } container.Register(registrations); } }
( AllSections IServerConfigurationProvider).
, ServerConfigurationProvider, ServerConfigurationProvider Windsor.
, , FindSection IServerConfigurationProvider.
Windsor Extension-:
container.RegisterAllConfigurationSections(configProvider);
рдирд┐рд╖реНрдХрд░реНрд╖
XML YAML, .
YAML-, XML, , .
YAML, . , , . , .
- ┬л ┬╗. , YAML- ( -).
тАФ , ┬л ┬╗.
, - , -, .. , - - .
AppSettings.Default, , .