private void GetNewAppInfos(DevelopBase.Discovery.IClient client, bool isWatch = true) { //获取远程列表 List <string> srvs = client.GetServerList(); if (Appinfos == null) { Appinfos = new Dictionary <string, DPBase.RemoteAppInfo>(); } lock (Appinfos) { //剔除已有项目 srvs.RemoveAll(c => Appinfos.Any(k => k.Key == c)); //增加新增项目 foreach (var item in srvs) { lock (Appinfos) { if (!Appinfos.Any(c => c.Key == item)) { var val = Newtonsoft.Json.JsonConvert.DeserializeObject <DPBase.RemoteAppInfo>(client.GetServer(item, isWatch)); Appinfos.Add(item, val); } } } } }
/// <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]); } } } }
/// <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); }