Example #1
0
        /// <summary>
        /// 向远端注册服务信息
        /// </summary>
        public void UpdateServer(IServiceProvider provider, DPBase.BaseServerInfo NewInfos)
        {
            //移除旧注册信息
            var servers  = provider.GetServices <DevelopBase.Discovery.IServer>();
            var Register = servers.First(c => c.GetType().GetInterfaces().Contains(DiscoveryMap[BaseServerInfo.DiscoveryInfo.ProtocolType].BaseInterface));

            //重置连接将删除以前全部数据
            Register.SetServer(BaseServerInfo.DiscoveryInfo.Connstring);
            lock (Registered)
            {
                Registered.Clear();
            }
            //更新本地缓存信息
            Appinfos = provider.GetService <HashSet <DPBase.Appinfo> >();
            if (Appinfos == null)
            {
                Appinfos = new HashSet <DPBase.Appinfo>();
            }
            foreach (var item in NewInfos.Appinfos)
            {
                lock (Appinfos)
                {
                    if (!Appinfos.Any(c => c.AppName == item.AppName))
                    {
                        Appinfos.Add(item);
                    }
                }
            }
            ProtocolInfos  = NewInfos.ProtocolInfos;
            BaseServerInfo = NewInfos;
            //重新注册信息
            foreach (var localInfo in Appinfos)
            {
                foreach (var SupportProtocolType in localInfo.SupportProtocolTypes)
                {
                    var remoteInfo = new DPBase.RemoteAppInfo()
                    {
                        AppName      = localInfo.AppName,
                        ProtocolType = SupportProtocolType,
                        HostName     = BaseServerInfo.HostName,
                        Infos        = BaseServerInfo.Infos,
                        HostAddr     = ProtocolInfos.First(c => c.ProtocolType == SupportProtocolType).HostAddr,
                        HostPort     = ProtocolInfos.First(c => c.ProtocolType == SupportProtocolType).HostPort,
                    };
                    lock (Registered)
                    {
                        var key = $"{remoteInfo.AppName}-{remoteInfo.HostName}-{remoteInfo.ProtocolType}";
                        Registered.Add(key, Newtonsoft.Json.JsonConvert.SerializeObject(remoteInfo));
                        Register.Register(key, Registered[key]);
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// 构造函数
        /// 设置引用服务信息
        ///
        /// 将用户设置信息序列化为对应的应用、协议和基础信息
        /// </summary>
        /// <param name="BaseInfo">具体服务信息</param>
        public BaseService(IServiceCollection serviceCollection, DPBase.BaseServerInfo BaseInfo)
        {
            if (BaseInfo == null)
            {
                throw new Exception($" {nameof(BaseInfo)} can't be null .");
            }
            //保存信息
            ProtocolInfos  = BaseInfo.ProtocolInfos;
            BaseServerInfo = BaseInfo;

            //本地映射信息因为是单例,所以要更新方式添加不能直接赋值
            Appinfos = serviceCollection.BuildServiceProvider().GetService <HashSet <DPBase.Appinfo> >();
            if (Appinfos == null)
            {
                Appinfos = new HashSet <DPBase.Appinfo>();
            }
            foreach (var item in BaseInfo.Appinfos)
            {
                lock (Appinfos)
                {
                    if (!Appinfos.Any(c => c.AppName == item.AppName))
                    {
                        Appinfos.Add(item);
                    }
                }
            }

            //依赖注入
            serviceCollection.AddServices(MapBaseSettings());
            var BaseProcess = new RegisterInfo()
            {
                FromName = "DevelopBase.Protocol.IBaseExtend, DevelopBase.Protocol",
                ToName   = "DevelopBase.Protocol.BaseExtend, DevelopBase.Protocol"
            };

            serviceCollection.AddServices(new RegisterInfo[] { BaseProcess });
            //单例注入
            serviceCollection.AddSingleton(Appinfos);
        }