/// <summary> /// 生成程序标识 /// 先生成一个程序唯一码 /// 保存到全局redis中(redis有设置的情况下) /// 获得该唯一码的标识 /// </summary> private void GenerateAppCode() { if (!ServerIoc.IsRegistered <IDatabase>()) { return; } var file = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.DirectorySeparatorChar}appcode.txt"; string guid = string.Empty; if (File.Exists(file)) { guid = File.ReadAllText(file); } if (string.IsNullOrEmpty(guid)) { guid = Guid.NewGuid().ToString("N"); File.Create(file).Close(); File.WriteAllText(file, guid); } var key = $"appcode:{guid}"; var redis = ServerIoc.Resolve <IDatabase>(); var value = redis.StringGet(key); if (string.IsNullOrEmpty(value)) { value = redis.StringIncrement("appcode"); redis.StringSet(key, value); } var appcode = Convert.ToInt16(value); if (Log.IsTraceEnabled) { Log.Trace($"AppCode:{value}"); } IdGenerator.AppCode = appcode; }
private ILifetimeScope LoadDistrictContainer(IDistrictConfig districtConfig) { if (districtConfig == null) { return(null); } if (Log.IsTraceEnabled) { Log.Trace($"=========== Init district container\t{districtConfig.Id} ==========="); } var configtypes = districtConfig.GetType().GetInterfaces(); var builder = new ContainerBuilder(); foreach (var type in configtypes) { var attrs = type.GetCustomAttributes(typeof(DistrictConfigRegisterAttribute), false); if (!attrs.Any()) { continue; } if (attrs[0] is DistrictConfigRegisterAttribute attr) { ((IDistrictConfigRegister)Activator.CreateInstance(attr.RegisterType)) .Register(builder, districtConfig); } } builder.Register(c => ServerIoc.Resolve <IRedisSerializer>()) .As <IRedisSerializer>() .SingleInstance(); builder.Register(c => new SqlConnection(c.ResolveKeyed <string>(ConnectionStringName))) .As <IDbConnection>() .InstancePerDependency(); builder.Register(c => new DefaultGameCache(c.Resolve <IRedisSerializer>(), c.Resolve <IDatabase>())) .As <IGameCache>() .InstancePerDependency(); builder.Register(c => districtConfig) .As <IDistrictConfig>() .AsImplementedInterfaces() .SingleInstance(); builder.Register(c => this) .As <IDistrictContainer>() .SingleInstance(); builder.Register(c => GetConfigAssemblyList()) .Keyed <List <Assembly> >("ConfigAssemblyList") .SingleInstance(); builder.Register(c => GetServiceAssemblyList()) .Keyed <List <Assembly> >("ServiceAssemblyList") .SingleInstance(); if (ServerIoc.IsRegistered <IMessageBroadcast>()) { builder.Register(c => ServerIoc.Resolve <IMessageBroadcast>()) .As <IMessageBroadcast>() .SingleInstance(); } else { builder.Register(c => new DefaultMessageBroadcast()) .As <IMessageBroadcast>() .SingleInstance(); } if (ServerIoc.IsRegistered <IPushService>()) { builder.Register(c => ServerIoc.Resolve <IPushService>()) .As <IPushService>() .SingleInstance(); } InitDistrictRepository(builder); var services = GetServiceAssemblyList(); if (services.Any()) { services.ForEach(x => { foreach (var type in x.GetTypes()) { if (type.IsInterface || type.IsAbstract || !typeof(IService).IsAssignableFrom(type)) { continue; } builder.RegisterType(type) //.Where(item => typeof(IService).IsAssignableFrom(item)) //.WithProperty("Test",123) .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies) //.WithProperty(new ResolvedParameter((pi, context) => pi.Name == "Resolver", (pi, ctx) => ctx)) .AsSelf() .SingleInstance(); } }); } BuildDistrictContainer(builder); var container = builder.Build(); foreach (var type in configtypes) { var attrs = type.GetCustomAttributes(typeof(DistrictConfigRegisterAttribute), false); if (!attrs.Any()) { continue; } if (attrs[0] is DistrictConfigRegisterAttribute attr) { if (Log.IsTraceEnabled) { Log.Trace($"SetUp DistrictConfig -> {type.Name}"); } ((IDistrictConfigRegister)Activator.CreateInstance(attr.RegisterType)) .SetUp(container, districtConfig); } } if (Log.IsTraceEnabled) { Log.Trace(""); } return(container.BeginLifetimeScope()); }