当前位置: 首页 > news >正文

discuz做服务网站武山县建设局网站

discuz做服务网站,武山县建设局网站,分析网站建设发展措施,最近三天国内重大新闻上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的#xff0c;所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题#xff0c;还有一个就是依赖注入在ActionFilter上的使用也是需要注意的… 上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题还有一个就是依赖注入在ActionFilter上的使用也是需要注意的地方。当我们的ActionFilter需要使用某个Service的时候我们一般会通过构造函数注入。演示一下首先自定义一个ActionFilter通过构造函数注入IMyService public interface IMyService{string GetServiceName(); }public class MyService : IMyService{public MyService (){Console.WriteLine(Service {0} created ., GetServiceName());}public string GetServiceName(){return MyService;}}public class FilterInjectAttribute: ActionFilterAttribute{public FilterInjectAttribute(IMyService myService){if (myService null){throw new ArgumentNullException(myService);}Console.WriteLine(Service {0} was injected ., myService.GetServiceName());}} 但是我们在使用Attribute的时候VS直接给出红色提示需要传入构造函数的参数否则无法编译过去。当然我们可以直接new一个MyService来当做参数但是很显然这样就失去了注入的那些好处了。在ActionFilter中使用依赖注入在ASP.NET Core的ActionFilter中使用依赖注入主要有两种方式ServiceFilterAttributeTypeFilterAttributeServiceFilterAttribute使用ServiceFilterAttribute可以使你的ActionFilter完成依赖注入。其实就是把你要用的ActionFilter本身注册为一个Service注册到DI容器中。通过ServiceFilter从容器中检索你的ActionFilter并且注入到需要的地方。所以第一步就是要注册你的ActionFilter: public void ConfigureServices(IServiceCollection services){services.AddScopedIMyService,MyService();services.AddScoped(typeof(FilterInjectAttribute));services.AddControllers();services.AddRazorPages();} 然后新建一个Controller在Action上使用ServiceFilter [ServiceFilter(typeof(FilterInjectAttribute))]public string DI(){Console.WriteLine(HomeController method DI running .);return DI;} 运行一下在浏览器里访问下对应的path可以看到MyService已经注入到FilterInjectAttribute中ServiceFilterAttribute的IsReusable属性:ServiceFilter有一个属性叫IsReusable。从字面意思也很好理解就是是否可重用的意思。显而易见如果这个属性设置为True那么多个请求就会复用这个ActionFilter这就有点像是单例的意思了。 [ServiceFilter(typeof(FilterInjectAttribute), IsReusable true)]public string DI(){Console.WriteLine(HomeController method DI running .);return DI;} 运行一下多次在浏览器中访问对应的action的path可以看到FilterInjectAttribute的构造函数只会执行一次。这里有一个重要提示 ASP.NET Core runtime 并不保证这个filter是真正的单例。所以不要试图使用这个属性来实现单例并且业务系统依赖这个单例。TypeFilterAttribute使用TypeFilterAttribute也可以使你的ActionFilter完成依赖注入。它跟ServiceFilterAttribute差不多但是使用TypeFilterAttribute注入的ActionFilter并不从DI容器中查找而是直接通过Microsoft.Extensions.DependencyInjection.ObjectFactory来实例化对象。所以我们的FilterInjectAttribute不需要提前注册到DI容器中。首先注释掉FilterInjectAttribute的注册代码: public void ConfigureServices(IServiceCollection services){services.AddScopedIMyService,MyService();//services.AddScoped(typeof(FilterInjectAttribute));services.AddControllers();services.AddRazorPages();} 改用TypeFilterAttribute [TypeFilter(typeof(FilterInjectAttribute))]public string DI(){Console.WriteLine(HomeController method DI running .);return DI;} 运行一下在浏览器里访问下对应的path可以看到MyService已经注入到FilterInjectAttribute中TypeFilterAttribute的IsReusable属性:跟上面的ServiceFilter一样ASP.NET Core runtime 并不保证这个filter是真正的单例这里就不多啰嗦了。TypeFilterAttribute的Arguments属性:Arguments参数是TypeFilterAttribute跟ServiceFilterAttribute的一个重要区别ServiceFilterAttribute并没有这属性。Arguments类型为object数组。通过TypeFilterAttribute实例化的ActionFilter如果它的构造器中的参数类型在DI容器中找不到会继续在Arguments参数列表里按顺序获取。改一下FilterInjectAttribute构造器多加入2个参数并且保证这2个参数无法从DI中取到 public class FilterInjectAttribute: ActionFilterAttribute{public FilterInjectAttribute(string arg1, IMyService myService, string arg2){if (myService null){throw new ArgumentNullException(myService);}Console.WriteLine(Service {0} was injected ., myService.GetServiceName());Console.WriteLine(arg1 is {0} ., arg1);Console.WriteLine(arg2 is {0} ., arg2);Console.WriteLine(FilterInjectAttribute was created .);}} 在使用的时候传入两个参数 [TypeFilter(typeof(FilterInjectAttribute), Arguments new object[] { HAHA, HOHO })]public string DI(){Console.WriteLine(HomeController method DI running .);return DI;} 运行一下看到两个参数被传入了FilterInjectAttribute的构造器总结ActionFilterAttribute的依赖注入可以通过ServiceFilterAttributeTypeFilterAttribute来实现ServiceFilterAttribute是通过DI容器来管理ActionFilterAttributeTypeFilterAttribute则是通过一个工厂直接实例化所以使用前不需要注册到DI容器中。IsReusable属性可以实现类似单例的功能但是运行时并不保证唯一单例。TypeFilterAttribute的Arguments属性可以作为参数列表。当实例化ActionFilterAttribute的时候如果构造器参数类型没有在DI容器中注册那么会尝试从Arguments列表中取。关注我的公众号一起玩转技术
http://www.huolong8.cn/news/281886/

相关文章:

  • wordpress如何备份 网站包头学做网站
  • 网站下载软件入口新公司注册流程及费用
  • 怎样把已经有的网站做推广个人适合做的网站
  • 旅游企业网站开发网站的布局和配色
  • 进行目的地网站建设国外免费搭建网站
  • 专业素材网站古塔网站建设
  • 06年可以做相册视频的网站wordpress中英文菜单
  • 开平做网站成品短视频软件推荐下载免费
  • 中国网站建设公司有哪些方面凡科做的网站为什么搜不到
  • 泰康人寿保险官方网站wordpress上传到虚机
  • 南宁的网站建设百度app安装免费下载
  • 重庆公司网站建设步骤seo网站设计联系方式
  • 建设网站如何索要素材网站建设详细描述产品的是什么意思
  • 怎样建设网站论文在大网站做网页广告需要多少钱
  • 卡密网站怎么做服装公司网站建设策划书
  • 使用iis搭建网站百度新站关键词排名
  • 中职国示范建设网站网站建设服务那家好
  • 有哪些做兼职的网站网站搭建徐州百度网络
  • 企业网站怎么建立做外贸推广的公司
  • 六安建设厅网站2023年国家免费技能培训
  • 大型网站建设定制开发建网站多少钱 万户
  • 如何做学校网站appdw网页制作软件免费
  • 网站策划薪资ip直接访问网站 备案
  • 天津网站建设方案维护做网站备案时间
  • 网站非法收录用户信息开发公司年终工作总结ppt
  • 网站开发公司哪个好景区电子商务网站建设
  • 网站说明怎么写网站建设具体要求
  • seo网站沙盒期内江 网站建设
  • 网站做百度推广能获取流量吗袜子技术支持北京网站建设
  • 建站公司都有哪些关于协会网站建设的建议