wenxiangchao
4 天以前 559890c482f5973f06aafdfec9550fee5ba3c7f2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Configuration;
using System.Linq;
 
namespace Plugin.DeviceConfig
{
    /// <summary>
    /// V3.0 仲裁域 / Broker 宿主候选枚举。
    /// 候选值从宿主配置文件 appSettings 读取(键:V3.AuthorityIds / V3.BrokerIds,分号分隔),
    /// 未配置时回退内置默认值,与 InfrastructureBootstrapper 的本地仲裁域 "local-main" 保持一致。
    /// </summary>
    public static class V3AuthorityCatalog
    {
        private const string FallbackAuthorityIds = "local-main;broker-b01";
        private const string FallbackBrokerIds = "broker-b01";
 
        /// <summary>全部合法仲裁域标识(Local 域以 local- 前缀标识,Broker 域即各 Broker 自身)</summary>
        public static string[] AuthorityIds => Read("V3.AuthorityIds", FallbackAuthorityIds);
 
        /// <summary>全部合法 Broker 宿主标识</summary>
        public static string[] BrokerIds => Read("V3.BrokerIds", FallbackBrokerIds);
 
        /// <summary>本机默认 Local 仲裁域(候选枚举中第一个 local- 前缀项)</summary>
        public static string LocalAuthorityId =>
            AuthorityIds.FirstOrDefault(a => a.StartsWith("local-", StringComparison.OrdinalIgnoreCase))
            ?? AuthorityIds[0];
 
        /// <summary>判断给定标识是否为 Local 仲裁域</summary>
        public static bool IsLocalAuthority(string? authorityId) =>
            !string.IsNullOrWhiteSpace(authorityId) &&
            authorityId!.StartsWith("local-", StringComparison.OrdinalIgnoreCase);
 
        private static string[] Read(string key, string fallback)
        {
            string? raw = null;
            try
            {
                raw = ConfigurationManager.AppSettings[key];
            }
            catch
            {
                // 宿主未提供配置文件时静默回退默认枚举
            }
            // net472 引用程序集无 NotNullWhen 标注,显式回退后解引用
            var value = string.IsNullOrWhiteSpace(raw) ? fallback : raw!;
            return value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                      .Select(s => s.Trim())
                      .Where(s => s.Length > 0)
                      .ToArray();
        }
    }
}