/// <summary>
        /// 找到值通过键
        /// </summary>
        /// <param name="osessionId">键</param>
        /// <returns><see cref="Properites"/></returns>
        public Task <Properites> FindById(string osessionId)
        {
            var osessionMapper = InMemoryStoragebox.ForNewOrExisted().OSessionStoreMapper;
            var properties     = osessionMapper.ContainsKey(osessionId) ? osessionMapper[osessionId] : null;

            return(Task.FromResult(properties));
        }
        /// <summary>
        /// 更新键值对,喂一个键,喂一个值
        /// </summary>
        /// <param name="osessionId">键</param>
        /// <param name="properties">值</param>
        /// <returns>Task</returns>
        public Task Update(string osessionId, Properites properties)
        {
            var osessionMapper = InMemoryStoragebox.ForNewOrExisted().OSessionStoreMapper;

            if (!osessionMapper.ContainsKey(osessionId))
            {
                throw new KeyNotFoundException(osessionId);
            }
            osessionMapper[osessionId] = properties.ToList();
            return(Task.FromResult(0));
        }
        /// <summary>
        /// 删除一个键值对通过键
        /// </summary>
        /// <param name="osessionId">键</param>
        /// <returns>Task</returns>
        public Task Delete(string osessionId)
        {
            var osessionMapper = InMemoryStoragebox.ForNewOrExisted().OSessionStoreMapper;

            if (!osessionMapper.ContainsKey(osessionId))
            {
                return(Task.FromResult(0));
            }
            osessionMapper.Remove(osessionId);
            return(Task.FromResult(0));
        }
示例#4
0
        /// <summary>
        /// 初始化路由(出现重复路由地址会抛异常)
        /// </summary>
        /// <param name="ounit">方法单元</param>
        /// <returns>Task</returns>
        public Task AddOrThrow(OUnit ounit)
        {
            var ounits = InMemoryStoragebox.ForNewOrExisted().UnitStoreRouterMapper;

            if (ounits.ContainsKey(ounit.RequestPath))
            {
                throw new Exception($"存在相同的路径!");
            }
            ounits[ounit.RequestPath] = ounit;
            return(Task.FromResult(0));
        }
        /// <summary>
        /// 找到指定路径所需要的角色,若不存在这个路径,返回<see cref="Role.@default"/>的值
        /// </summary>
        /// <param name="path">虚拟路径</param>
        /// <returns><see cref="Role.@default"/>的值</returns>
        public Task <int> FindRoleByPath(string path)
        {
            var ounits  = InMemoryStoragebox.ForNewOrExisted().UnitStoreRouterMapper;
            var pathkey = new PathString(path);

            if (!ounits.ContainsKey(pathkey))
            {
                return(Task.FromResult((int)Role.@default));
            }
            return(Task.FromResult((int)ounits[pathkey].Role));
        }
示例#6
0
        /// <summary>
        /// 回收
        /// </summary>
        /// <param name="ounit">方法单元</param>
        /// <param name="instance">方法所在类型的实例</param>
        /// <returns>Task</returns>
        public Task Recycle(OUnit ounit, object instance)
        {
            var oapimethods = InMemoryStoragebox.ForNewOrExisted().OAPIMethodsStoreTypeMapper;

            if (!oapimethods.ContainsKey(ounit.TypeofInstance))
            {
                oapimethods[ounit.TypeofInstance] = new Stack <OAPIMethodsBase>();
            }
            var typeofinstance = (OAPIMethodsBase)instance;

            typeofinstance.SetHttpContext = null;
            oapimethods[ounit.TypeofInstance].Push(typeofinstance);
            return(Task.FromResult(0));
        }
示例#7
0
        /// <summary>
        /// 指定路径找到方法单元和方法所在类型的实例
        /// </summary>
        /// <param name="path">虚拟路径</param>
        /// <returns>二元组</returns>
        public Task <(OUnit, object)> FindOUnitTypeofInstanceByPath(string path)
        {
            var ounits      = InMemoryStoragebox.ForNewOrExisted().UnitStoreRouterMapper;
            var oapimethods = InMemoryStoragebox.ForNewOrExisted().OAPIMethodsStoreTypeMapper;
            var pathkey     = new PathString(path);

            if (!ounits.ContainsKey(pathkey))
            {
                var _ounit    = ounits[new PathString(DefaultMethods.notfound)];
                var _instance = oapimethods.ContainsKey(_ounit.TypeofInstance) && oapimethods[_ounit.TypeofInstance].Count > 0 ?
                                oapimethods[_ounit.TypeofInstance].Pop() :
                                _ounit.TypeofInstance.GetMethod("ForNew", BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
                return(Task.FromResult(new ValueTuple <OUnit, object>(_ounit, _instance)));
            }
            var ounit = ounits[pathkey];
            //TODO.. 怎么在不同线程中抓到异常?
            var instance = oapimethods.ContainsKey(ounit.TypeofInstance) && oapimethods[ounit.TypeofInstance].Count > 0 ?
                           oapimethods[ounit.TypeofInstance].Pop() :
                           (ounit.TypeofInstance.GetMethod("ForNew", BindingFlags.Public | BindingFlags.Static) ??
                            throw new Exception($"在{nameof(ounit.TypeofInstance)}里面必须实现名字为ForNew的无参静态函数!"))
                           .Invoke(null, null);

            return(Task.FromResult(new ValueTuple <OUnit, object>(ounit, instance)));
        }
 /// <summary>
 /// 新增一个键值对到存储中
 /// </summary>
 /// <param name="osessionId">键</param>
 /// <param name="properties">值</param>
 /// <returns>Task</returns>
 public Task Add(string osessionId, Properites properties)
 {
     InMemoryStoragebox.ForNewOrExisted().OSessionStoreMapper.Add(osessionId, properties.ToList());
     return(Task.FromResult(0));
 }
        public ORouterMiddlewareOptions(string fileName) : base(new SharedOptions())
        {
            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException($"参数{nameof(fileName)}不能为空,调用该方法所在的程序集的文件名字");
            }
            this.Filename = fileName;
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            m_Store        = ORouterMiddlewareDefaults.Store;
            m_NotLogin     = ORouterMiddlewareDefaults.NotLogin;
            m_NotFound     = ORouterMiddlewareDefaults.NotFound;
            m_Forbidden    = ORouterMiddlewareDefaults.Forbidden;
            m_NoPermission = ORouterMiddlewareDefaults.NoPermission;
            m_Index        = ORouterMiddlewareDefaults.Index;
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var sender = Assembly.LoadFrom(fileName);

            if (sender == null)
            {
                throw new ArgumentNullException($"参数{nameof(fileName)}所描述的地址不存在程序集!");
            }
            var box   = InMemoryStoragebox.ForNewOrExisted();
            var types = sender.GetTypes();
            var typeofInstancebase = typeof(OAPIMethodsBase);
            var typeofInstances    = box.Inheritances;

            typeofInstances.RemoveAll(f => f == typeof(DefaultMethods));
            typeofInstances.Add(typeof(DefaultMethods));
            for (int i = 0, length = types.Length; i < length; i++)
            {
                var type = types[i];
                while (type.BaseType != null)
                {
                    if (type.BaseType != typeofInstancebase)
                    {
                        break;
                    }
                    typeofInstances.RemoveAll(f => f == type);
                    typeofInstances.Add(type);
                    break;
                }
            }
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            for (int i = 0, count = typeofInstances.Count; i < count; i++)
            {
                var typeofInstance = typeofInstances[i];
                var enumerator     = typeofInstance.GetMethods().GetEnumerator();
                var test1          = new GetCorrectORouterAttr();
                var test2          = new GetCorrectORoleAttr();
                while (enumerator.MoveNext())
                {
                    var method = (MethodInfo)enumerator.Current;
                    //TODO.. 我只接受无参的方法..
                    if (method.GetParameters().Length != 0)
                    {
                        continue;
                    }
                    var orouterattrs = (ORouterAttribute[])method.GetCustomAttributes(typeof(ORouterAttribute), false);
                    var oroleattrs   = (ORoleAttribute[])method.GetCustomAttributes(typeof(ORoleAttribute), false);
                    if (orouterattrs.Length == 0 || oroleattrs.Length == 0)
                    {
                        continue;
                    }
                    //var paths = orouterattrs.Select(f => new { f.Path, f.Final }).Distinct();
                    var _orouterattrs = orouterattrs.Select(f => new ORouterAttr {
                        Final = f.Final, Path = f.Path
                    }).Distinct(test1).ToArray();
                    var _orouterattrlist = new List <ORouterAttr>();
                    var _oroleattrs      = oroleattrs.Select(f => f.Role).Distinct(test2).ToArray();
                    var oroleattr        = Role.@default;
                    {
                        for (int j = 0, length = _oroleattrs.Length; j < length; j++)
                        {
                            if (j == 0)
                            {
                                oroleattr = _oroleattrs[j];
                                continue;
                            }
                            if ((int)_oroleattrs[j - 1] < (int)_oroleattrs[j])
                            {
                                oroleattr = _oroleattrs[j - 1];
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                    {
                        for (int j = 0, length = _orouterattrs.Length; j < length; j++)
                        {
                            _orouterattrlist.Add(_orouterattrs[j]);
                            _orouterattrlist.Add(new ORouterAttr {
                                Final = _orouterattrs[j].Final, Path = $"{_orouterattrs[j].Path}/"
                            });
                        }
                    }
                    {
                        for (int j = 0, jcount = _orouterattrlist.Count; j < jcount; j++)
                        {
                            m_Store.AddOrThrow(
                                new Unit
                            {
                                RequestPath    = new PathString(_orouterattrlist[j].Path),
                                Final          = _orouterattrlist[j].Final,
                                Method         = method,
                                Role           = oroleattr,
                                TypeofInstance = typeofInstance
                            });
                        }
                    }
                }
            }
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var storagebox           = InMemoryStoragebox.ForNewOrExisted();
            var storageboxenumerator = storagebox.UnitStoreRouterMapper.GetEnumerator();

            while (storageboxenumerator.MoveNext())
            {
                var keyvaluepair = storageboxenumerator.Current;
                Console.WriteLine(
                    $"虚拟路径:{keyvaluepair.Key.Value}  " +
                    $"访问角色:{keyvaluepair.Value.Role}"
                    );
            }
        }
示例#10
0
 static internal InMemoryStoragebox ForNewOrExisted() =>
 instance ?? (instance = new InMemoryStoragebox());