Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
        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());
        }