我不会.Net core 只会用FineUICore 吃了药的大聪明都知道 FineUICore.PageContext.Current 存的是当前的上下文,是一个HttpContext对象,在里面可以拿到Session、请求参数、纳皮尔常数等信息,今天我就来讲一下熘肉片的诀窍是什么。
我也不老懂的,自己查资料吧
知道了依赖注入后,我们扭过大跨再来看下 Startup.cs ,下有一个 Configure ,Configure 里有代码 app.UseFineUI();
// FineUI 中间件(确保 UseFineUI 位于 UseEndpoints 的前面) app.UseFineUI();
FineUICore就是从这里 拿到了依赖,这里的 app是IApplicationBuilder
百度和我们还知道 有一个接口可以找到所有的注入实例就是 IServiceProvider,其中有一个方法 GetRequiredService 和 GetService (两者的区别是 GetRequiredService 如果拿不到实例会抛出异常)可以得到指定类型的注入,详见这篇文章。
app 中的 ApplicationServices 就是 IServiceProvider
上下文 HttpContext 就在 实现 IHttpContextAccessor 的Service中,所以有:
var Current = app.ApplicationServices?.GetService<IHttpContextAccessor>()?.HttpContext;
FineUICore.PageContext 也有 GetService 方法,那其实 PageContext 中就是有一个 IServiceProvider 静态变量 HttpContext 中还有一个获取容器的参数 HttpContext.RequestServices 也是一个 IServiceProvider
注意
Task.Run(() =>{}) 可能会导致上下文丢失
虽然FineUICore提供了一些方法很方便很贴心,但是对于一些底层方法还是要自己实现,引用FineUI就大材小用了,我发现项目中中间层的类库一定程度上依赖FineUI,这为将来升级带来隐患,要将这部分代码剥离替换。
不仅要学会使用,还应该懂得拆解学习,让FineUI成为自己的,这才能让别人的代码更有意义。所以诀窍就是热锅冷油,翻炒到泡泡变少。
/// <summary> /// 当有多个实现类,根据类名得到 具体那个 /// </summary> /// <param name="type"></param> /// <exception cref="NotImplementedException"></exception> public static T GetServerByStr<T>(string type = "") where T : class { T server = default; try { if (string.IsNullOrEmpty(type)) { try { server = _ServiceProvider!.GetService<T>(); } catch { } if (server == null) { server = _ServiceProvider!.CreateScope().ServiceProvider.GetRequiredService<T>(); } return server; } try { var servers = _ServiceProvider!.GetServices<T>().ToList(); server = servers.FirstOrDefault(m => m.GetType().ToString().Contains(type)); } catch { var servers = Current?.RequestServices.GetServices<T>().ToList(); server = servers!.FirstOrDefault(m => m.GetType().ToString().Contains(type)); } } catch { } return server!; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T? GetServerByApp<T>() { if (PageContext._ApplicationBuilder == null && _ServiceProvider != null) { return _ServiceProvider!.GetService<T>() ?? _ServiceProvider!.CreateScope().ServiceProvider.GetService<T>(); }; var serviceScope = PageContext._ApplicationBuilder?.ApplicationServices.CreateScope(); return serviceScope!.ServiceProvider.GetService<T>(); } /// <summary> /// 从上下文获取服务 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static dynamic GetServerByApp(Type T) { if (PageContext._ApplicationBuilder == null) { return _ServiceProvider!.GetService(T) ?? _ServiceProvider!.CreateScope().ServiceProvider.GetService(T); }; var serviceScope = PageContext._ApplicationBuilder?.ApplicationServices.CreateScope(); return serviceScope!.ServiceProvider.GetService(T); }
本文作者:没想好
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!