/// <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)); }
/// <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)); }
/// <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)); }
/// <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}" ); } }
static internal InMemoryStoragebox ForNewOrExisted() => instance ?? (instance = new InMemoryStoragebox());