第二节:框架前期准备篇之AutoFac常见用法总结

一. 说在前面的话

  凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点点小小的风波,我说我的好,他说他的好,非常容易骂架,所以在本节乃至该系列我仅仅是总结了一下自己日常中的一些用法,谈一下自己浅陋的见解,谈不上最佳,只要不误导新手 能有点帮助作用就可以了,如您不喜欢,请“右上角  谢谢”。

  在框架搭建过程中,在层与层的解耦方面,势必会涉及到IOC框架,.Net 平台下我用过的IOC框架主要是: Spring.Net 、Unity、AutoFac,当然还有Castle(我没用过,就不发表任何评论了), 在用过的IOC框架中,Spring.Net 相对很老了,貌似在2015年就不在更新了,但基本的功能也够用了。 现阶段用的最多的就是Unity和AutoFac了,版本更新也比较快,Unity大约一年前写过两篇文章了,本次在该框架系列也会考虑更新一下Unity,本节主要介绍一下AutoFac的几个基本用法。

  先说一下两个概念IOC和DI,我的理解:

  ① IOC:调用者不再创建(不自己new)被调用者的实例,而是交给容器去创建(AutoFac就充当这里的容器),这就是控制反转。

  ② DI:容器创建好的实例再注入调用者的过程,就是依赖注入(比如:属性注入、构造函数注入等)。

AutoFac的信息:

  ① 官网地址:https://autofac.org/

  ② 官方文档:http://autofac.readthedocs.io/en/latest/index.html

  ③ 最新版本:4.8.1 (截止2018-08-21)

  本节的内容主要包括:

    1. 在使用IOC框架之前的几种创建对象的方式。

    2. AutoFac的基本用法和几种生命周期。

    3. AutoFac和Asp.Net MVC5进行整合,利用属性的方式进行注入。

事先说明一下本节要用到的实现类和接口类:

(1). Ypf.BLL层中包括:CatBLL、DogBLL、RoleBLL、UserBLL。

 CatBLL

 DogBLL

 RoleBLL

 UserBLL

(2). Ypf.IBLL层包括:IAnimalBLL、IPeopleBLL、IRoleBLL、IUserBLL。

 IAnimalBLL

 IPeopleBLL

 IRoleBLL

 IUserBLL

 

二. 引入IOC框架之前的几个写法

1. 最原始的方式直接new(需添加对BLL层的引用)

1 {
2    UserBLL userBll = new UserBLL();
3    var result1 = userBll.GetUserInfor();
4    Console.WriteLine(result1);
5 }

 

2. 面向接口编程(仍需添加对BLL层的引用)

1   {
2      IUserBLL userBll = new UserBLL();
3      var result1 = userBll.GetUserInfor();
4      Console.WriteLine(result1);
5   }

 

3. 接口+反射(只需将BLL层的程序集拷贝进来)

复制代码

 1 {2   Assembly ass = Assembly.Load("Ypf.BLL");3   Type type = ass.GetType("Ypf.BLL.UserBLL");4   //调用默认的无参构造函数进行对象的创建5   object myUserBLL = Activator.CreateInstance(type);6   IUserBLL userBLL = (IUserBLL)myUserBLL;7   var result1 = userBLL.GetUserInfor();8   Console.WriteLine(result1);9 
10 }

复制代码

 

4. 手写IOC(反射+简单工厂+配置文件)【需将BLL层的程序集拷贝进来】

 配置文件代码:

  <appSettings><!--直接修改配置文件,可以切换IUserBLL的实现类,发布后可以直接通过改配置文件,代码什么也不用改,体会:反射+面向接口编程--><add key="DllName" value="Ypf.BLL"/><add key="ClassName" value="Ypf.BLL.UserBLL"/></appSettings>

简单工厂代码:

复制代码

 1     /// <summary>2     /// 简单工厂,隔离对象的创建3     /// </summary>4    public class SimpleFactory5     {6         private static string DllName = ConfigurationManager.AppSettings["DllName"];7         private static string ClassName = ConfigurationManager.AppSettings["ClassName"];8         public static IUserBLL CreateInstance()9         {
10             Assembly ass = Assembly.Load(DllName);
11             Type type = ass.GetType(ClassName);
12             object obj = Activator.CreateInstance(type);
13             return (IUserBLL)obj;
14         }
15     }

复制代码

调用代码:

1 {
2       IUserBLL userBLL = SimpleFactory.CreateInstance();
3       var result = userBLL.GetUserInfor();
4       Console.WriteLine(result);
5 }

 

三. AutoFac常见用法总结

1. 基本用法

   同时添加对Ypf.BLL层和Ypf.IBLL层的引用,然后 声明容器→注册实例→解析对象→调用方法、进行测试,代码如下:

复制代码

1  {
2      ContainerBuilder builder = new ContainerBuilder();
3      //把UserBLL注册为IUserBLL实现类,当请求IUserBLL接口的时候,返回UserBLL对象
4      builder.RegisterType<UserBLL>().As<IUserBLL>();
5      IContainer resolver = builder.Build();
6      IUserBLL userBLL = resolver.Resolve<IUserBLL>();
7      var result1 = userBLL.GetUserInfor();
8      Console.WriteLine(result1);
9 }

复制代码

  评价:这种用法单纯的是为了介绍AutoFac中的几个方法,仅此而已,在实际开发没有这么用的,坑比用法,起不到任何解耦的作用。

 

2. AsImplementedInterfaces的用法

   在很多情况下,一个类可能实现了多个接口, 如果我们通过  builder.RegisterType<xxxBLL>().As<IxxxBLL>(); 这种方式按部就班排着把这个类注册给每个接口,实现几个接口,就要写几行注册代码,很繁琐,我们可以通过 AsImplementedInterfaces() 方法,可以把一个类注册给它实现的全部接口。

   这样的话,想用哪个接口,通过Resolve解析即可,代码如下:

复制代码

 1 {2      ContainerBuilder builder = new ContainerBuilder();3      //这样请求UserBLL实现的任何接口的时候都会返回 UserBLL 对象。4      builder.RegisterType<UserBLL>().AsImplementedInterfaces();5      IContainer resolver = builder.Build();6      IUserBLL iUserBLL = resolver.Resolve<IUserBLL>();7      IPeopleBLL iPeopleBLL = resolver.Resolve<IPeopleBLL>();8 9      var r1 = iUserBLL.GetUserInfor();
10      var r2 = iPeopleBLL.Introduce();
11 
12      Console.WriteLine(r1);
13      Console.WriteLine(r2);
14 }

复制代码

  评价:同时添加对Ypf.BLL层和Ypf.IBLL层的引用,这里也是单纯的为了介绍AsImplementedInterfaces()的用法,还是存在实现类的身影,在实际开发中没有这么用的,起不到任何解耦的作用,坑比用法。

 

3. AutoFac+反射(彻底消灭实现类)

  引入反射的背景:前面两种方式都需要添加对Ypf.BLL层的引用,麻烦的要死,根本没有什么改观,还是紧耦合在一起。并且如果有很多接口和实现类的话,用RegisterType一行一行的去写,累个半死,在这种情况下引入反射的概念,简化代码量,代码如下:

复制代码

 1  {2       ContainerBuilder builder = new ContainerBuilder();3       //加载实现类的程序集4       Assembly asm = Assembly.Load("Ypf.BLL");5       builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();6       IContainer resolver = builder.Build();7 8       IUserBLL userBLL = resolver.Resolve<IUserBLL>();9       IPeopleBLL peopleBLL = resolver.Resolve<IPeopleBLL>();
10       var r1 = userBLL.GetUserInfor();
11       var r2 = peopleBLL.Introduce();
12 
13       Console.WriteLine(r1);
14       Console.WriteLine(r2);
15 }

复制代码

  评价:彻底摆脱了实现类的身影,与Ypf.BLL层进行了解耦,只需要添加对Ypf.IBLL层的引用,但需要把Ypf.BLL的程序集拷贝到AutoFacTest项目下。

小小的升级一下:

   把反射那个程序集类写到配置文件中,然后在代码中通过读取配置文件进行进一步的反射,代码如下:

1  <appSettings>
2     <add key="DllName" value="Ypf.BLL"/>
3   </appSettings>

复制代码

 1  {2      ContainerBuilder builder = new ContainerBuilder();3      //加载实现类的程序集4     string DllName = ConfigurationManager.AppSettings["DllName"];5     Assembly asm = Assembly.Load(DllName);6     builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();7     IContainer resolver = builder.Build();8 9     IUserBLL userBLL = resolver.Resolve<IUserBLL>();
10     IPeopleBLL peopleBLL = resolver.Resolve<IPeopleBLL>();
11     var r1 = userBLL.GetUserInfor();
12     var r2 = peopleBLL.Introduce();
13 
14     Console.WriteLine(r1);
15     Console.WriteLine(r2);
16 }

复制代码

 

4. PropertiesAutowired(属性的自动注入)

  背景:一个实现类中定义了其他类型的接口属性,比如RoleBLL中定义IUserBLL的接口属性,而且要对其进行调用, 这个时候就需要通过PropertiesAutowired实现属性的自动注入了。

  注:只有通过AutoFac创建的对象才能实现属性的自动注入!! 相关的类、接口要是public类型。

 RoleBLL

复制代码

 1 {2      ContainerBuilder builder = new ContainerBuilder();3      //加载实现类的程序集4      Assembly asm = Assembly.Load("Ypf.BLL");5      builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();6      IContainer resolver = builder.Build();7 8      IRoleBLL iRoleBLL = resolver.Resolve<IRoleBLL>();9      var r1 = iRoleBLL.ShowDIDemo();
10      Console.WriteLine(r1);
}

复制代码

  下面测试一下不是AutoFac创建的对象能否实现属性的自动注入,新建TempTest类,在里面声明IUserBLL属性,并且在方法中进行调用,然后new一个TempTest对象,对该showMsg方法进行调用,发现报空指针错误,说明userBLL属性为空,没能自动注入。

复制代码

1  public class TempTest
2     {
3         public IUserBLL userBLL { get; set; }
4 
5         public void showMsg()
6         {
7             Console.WriteLine(userBLL.GetUserInfor());
8         }
9     }

复制代码

1 //测试自己new的对象不能实现属性的自动注入
2 //下面代码报空指针错误
3 {
4      TempTest t = new TempTest();
5      t.showMsg();
6 }

 

5. 1个接口多个实现类的情况

  背景:1个接口有多个实现类的情况(DogBLL 和 CatBLL 都实现了 IAnimalBLL接口)

  分析:resolver.Resolve<IAnimalBLL>();只会返回其中一个类的对象

  解决方案:如果想返回多个实现类的对象,改成 resolver.Resolve<IEnumerable<IAnimalBLL>>()即可。

复制代码

 1             {2                 ContainerBuilder builder = new ContainerBuilder();3                 //加载实现类的程序集4                 Assembly asm = Assembly.Load("Ypf.BLL");5                 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();6                 IContainer resolver = builder.Build();7 8                 //返回 CalBLL 和 DogBLL 中的一个9                 //{
10                 //    IAnimalBLL iAnimalBLL = resolver.Resolve<IAnimalBLL>();
11                 //    var r1 = iAnimalBLL.Introduce();
12                 //    Console.WriteLine(r1);
13                 //}
14 
15                 //如何获取多个呢?
16                 {
17                     IEnumerable<IAnimalBLL> blls = resolver.Resolve<IEnumerable<IAnimalBLL>>();
18                     foreach (IAnimalBLL animalBLL in blls)
19                     {
20                         Console.WriteLine(animalBLL.GetType());
21                         Console.WriteLine(animalBLL.Introduce());
22                     }
23                 }
24             }

复制代码

 

6. AutoFac的几种常见生命周期

1. InstancePerDependency:每次请求 Resovle都返回一个新对象。InstancePerDependency()【这也是默认的创建实例的方式。】

2. SingleInstance: 单例,只有在第一次请求的时候创建 。SingleInstance()

3. InstancePerRequest:ASP.Net MVC 专用,每次http请求内一个对象(也可以理解为一个方法内)。InstancePerRequest() 和 CallContext神似

4. InstancePerLifetimeScope:在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。

 下面测试一下前两种生命周期

 情况1

复制代码

 1   {2     ContainerBuilder builder = new ContainerBuilder();3     //加载实现类的程序集4     Assembly asm = Assembly.Load("Ypf.BLL");5     builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired().InstancePerDependency();6     IContainer resolver = builder.Build();7 8     IUserBLL u1 = resolver.Resolve<IUserBLL>();9     IUserBLL u2 = resolver.Resolve<IUserBLL>();
10 
11     Console.WriteLine(object.ReferenceEquals(u1, u2));
12 
13  }

复制代码

结果:False,证明InstancePerDependency 每次都创建一个新对象

情况2

复制代码

 1   {2      ContainerBuilder builder = new ContainerBuilder();3      //加载实现类的程序集4      Assembly asm = Assembly.Load("Ypf.BLL");5      builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired().SingleInstance();6      IContainer resolver = builder.Build();7 8      IUserBLL u1 = resolver.Resolve<IUserBLL>();9      IUserBLL u2 = resolver.Resolve<IUserBLL>();
10 
11      Console.WriteLine(object.ReferenceEquals(u1, u2));
12 
13 }

复制代码

结果:true,证明SingleInstance 每次都返回同一个对象。

 

四. AutoFac与MVC整合

1. Controller中通过属性注入对象

 步骤1:在Ypf.MVC层中添加对Ypf.IBLL层的引用,并将Ypf.BLL的程序集拷贝到 Ypf.MVC中,或者直接改一下Ypf.BLL输出路径。

 步骤2:通过Nuget安装程序集 Autofac.Mvc5。

 步骤3:在Gloabl 注册 AutoFac代码。

复制代码

 1  public class MvcApplication : System.Web.HttpApplication2     {3         protected void Application_Start()4         {5             AreaRegistration.RegisterAllAreas();6             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);7             RouteConfig.RegisterRoutes(RouteTable.Routes);8             BundleConfig.RegisterBundles(BundleTable.Bundles);9 
10             /***********下面是AutoFac的注册*************/
11             //1. 创建容器
12             var builder = new ContainerBuilder();
13             //2. 把当前程序集中的所有Controller都注册进来
14             builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
15             //3. 把Ypf.BLL中的所有类注册给它的全部实现接口,并且把实现类中的属性也进行注册
16             //{ Assembly asmService = Assembly.Load("Ypf.BLL"); }
17             //PS:这里可以配合配置文件的,将Ypf.BLL写到配置文件中
18             string DllName = ConfigurationManager.AppSettings["DllName"];
19             Assembly asmService = Assembly.Load(DllName);
20             builder.RegisterAssemblyTypes(asmService).Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired();
21             var container = builder.Build();
22             //4. 下面这句话表示当mvc创建controller对象的时候,都是由AutoFac为我们创建Controller对象
23             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
24 
25 
26         }
27     }

复制代码

PS:分享个小技巧

步骤4:在Controller中进行调用。

 

2. 普通类中通过代码获取对象

  在一个没有通过AutoFac注册的普通类中如何获取接口对象呢,通过DependencyResolver.Current.GetService<IUserBLL>();来获取。

  代码如下:

复制代码

1   public class Utils
2     {
3         public static string Test()
4         {       
5             IUserBLL userBLL = DependencyResolver.Current.GetService<IUserBLL>();
6             return userBLL.GetUserInfor();
7         }
8     }

复制代码

 

3. 如何在普通类中通过属性的方式注入对象

需要有两个条件:

  ①: 这个普通类的创建必须在Global中通过AutoFac来进行注册。

  ②: 获取这个类的时候必须通过 DependencyResolver.Current.GetService<IUserBLL>(); 这种方式来获取。

 在Global文件中注册该普通类

 

该普通类CommonHelp的获取必须通过DependencyResolver.Current.GetService<CommonHelp>();方式来获取。

 

4. 在单独线程中获取对象

  比如在Quartz.Net 中,需要通过下面代码来获取。

详细代码如下:

复制代码

 {//1.创建作业调度池(Scheduler)IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();//2.创建一个具体的作业即job (具体的job需要单独在一个文件中执行)var job = JobBuilder.Create<HelloJob>().Build();//3.创建并配置一个触发器即trigger   1s执行一次var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever()).Build();//4.将job和trigger加入到作业调度池中scheduler.ScheduleJob(job, trigger);//5.开启调度scheduler.Start();
}

复制代码

复制代码

 1  public class HelloJob:IJob2     {3         void IJob.Execute(IJobExecutionContext context)4         {5             IUserBLL userBLL;6             var container = AutofacDependencyResolver.Current.ApplicationContainer;7             using (container.BeginLifetimeScope())8             {9                 userBLL = container.Resolve<IUserBLL>();
10             }
11             //下面代码只是测试
12             Console.WriteLine(userBLL.GetUserInfor());
13         }
14     }

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult

一. 背景 在MVC框架中&#xff0c;我们可能经常会用到 return Json()&#xff0c;而Json方法内部又是一个JsonResult类&#xff0c;那么JsonResult内部又是什么原理呢&#xff1f;在MVC框架中&#xff0c;各种xxxResult便捷了我们的开发&#xff0c;但这些都不是本节的重点&…

php 跳转qq群代码_邪少xml论坛qqxml代码—QQ音乐可播放框架QQ群任意跳转个人网站链接引流...

邪少XML论坛xml代码—QQ音乐可播放框架效果图&#xff1a;代码如下&#xff1a;<?xml version1.0 encodingUTF-8 standaloneyes ?><msg serviceID"2" templateID"1" action"web" brief"[分享] 古分一道桥" sourceMsgId&quo…

第四节:框架前期准备篇之进程外Session的两种配置方式

一. 基本介绍 1. 背景&#xff1a;Asp.Net默认的Session机制是进程内&#xff0c;存储在服务器端内存中&#xff0c;有这么几个缺点&#xff1a; ①&#xff1a;既然存在内存中&#xff0c;空间有限&#xff0c;不能存储大数据量信息&#xff0c;数据量多的话Session会被挤爆。…

广播延时大约多久_在长沙广播电台打广告要多少钱?

在长沙这个堵城&#xff0c;特别是每天上下班高峰期&#xff0c;很多人都堵在车里。有调查统计显示&#xff0c;长沙市高峰拥堵延时指数1.711&#xff0c;即高峰出行时间是畅通状态下的1.711倍&#xff0c;高峰平均行车速度24.9km/h。在堵车的时候&#xff0c;容易着急上火&…

云计算-Linux-用户管理,用户信息文件详解

云计算-Linux-用户管理,用户信息文件详解 这个就不讲啥了,用户干啥用的还能不知道吗 这个用户目录是在这/etc/skel下的 创建用户 useradd(只有root才能用) 扩展参数 -u指定用户的UID -d指定用户的家目录 -c指定用户的描述信息(备注) -g指定用户基本组 -G指定用户附加组 -s…

第五节:框架前期准备篇之锁机制处理并发

一. 简介 (一). 在处理并发的这个问题上&#xff0c;锁大致分为两类&#xff1a;悲观锁和乐观锁。 1. 悲观锁&#xff1a;悲观的认为每次去拿数据的时候都会被别人修改&#xff0c;所以每次在拿数据的时候都会“上锁”&#xff0c;操作完成之后再“解锁”。 在数据加锁期间&a…

表面粗糙度的基本评定参数是_表面粗糙度100问,讲得明明白白

提醒&#xff1a;点上方↑↑↑“制造原理”订阅后 满足你的好奇来源&#xff1a;机械工程师1&#xff0e; 什么称为表面粗糙度&#xff1f;答&#xff1a;表面粗糙度是指零件加工表面上具有的由较小间距和峰谷所组成的微观几何形状特征。它是一种微观几何形状误差。2&#xff0…

第六节:框架搭建之EF的Fluent Api模式的使用流程

一. 前言 沉寂了约一个月的时间&#xff0c;今天用一篇简单的文章重新回归博客&#xff0c;主要来探讨一下Fluent Api模式在实际项目中的使用流程。 1. Fluent API属于EF CodeFirst模式的一种&#xff0c;EF还有一种模式是DataAnnotations&#xff0c;两种模式各有千秋吧&…

高通modem启动过程_苹果首次承认正自研基带芯片,高通要被抛弃了?

以苹果技术实力&#xff0c;摆脱依赖&#xff0c;只是时间的问题。”作者 | 肖漫苹果和高通的基带芯片故事续集&#xff0c;又开始上映了。据彭博社 12 月 10 日报道&#xff0c;苹果公司芯片负责人对员工表示&#xff0c;苹果已开始为未来的设备自研蜂窝调制解调器&#xff0c…

第七节:框架搭建之页面静态化的剖析

一. 前言 抛砖引玉&#xff1a; 提到项目性能优化&#xff0c;大部分人第一时间就会想到缓存&#xff0c;针对“读多写少”的数据&#xff0c;可以放到缓存里&#xff0c;设置个过期时间&#xff0c;这样就不用每次都去数据库中查询了&#xff0c; 减轻了数据库的压力&#xff…

第八节:数据库层次的锁机制详解和事务隔离级别

一. 基本概念 1.共享锁&#xff1a;(holdlock) (1). select的时候会自动加上共享锁&#xff0c;该条语句执行完&#xff0c;共享锁立即释放&#xff0c;与事务是否提交没有关系。 (2). 显式通过添加(holdlock)来显式添加共享锁&#xff08;比如给select语句显式添加共享锁&…

第九节:基于MVC5+AutoFac+EF+Log4Net的基础结构搭建

一. 前言 从本节开始&#xff0c;将陆续的介绍几种框架搭建组合形式&#xff0c;分析每种搭建形式的优势和弊端&#xff0c;剖析搭建过程中涉及到的一些思想和技巧。 (一). 技术选型 1. DotNet框架&#xff1a;4.6 2. 数据库访问&#xff1a;EF 6.2 (CodeFrist模式) 3. IOC框架…

第十节:基于MVC5+Unity+EF+Log4Net的基础结构搭建

一. 前言 从本节开始&#xff0c;将陆续的介绍几种框架搭建组合形式&#xff0c;分析每种搭建形式的优势和弊端&#xff0c;剖析搭建过程中涉及到的一些思想和技巧。 (一). 技术选型 1. DotNet框架&#xff1a;4.6 2. 数据库访问&#xff1a;EF 6.2 (CodeFrist模式) 3. IOC框架…

a*算法的优缺点_K-近邻算法以及案例

什么是K-近邻算法(KNN)根据邻居判断类型。如果一个样本在特征空间中有K个最相似&#xff08;距离相近&#xff09;的样本大多数属于一个类别&#xff0c;则该样品也属于这个类别。如何求距离呢?非常简单,如图。a1,a2,a3代表样本a的特征值 b1,b2,b3代表b的样本值&#xff0c;根…

android 预约挂号代码_告别排队!用Python定时自动挂号和快捷查询化验报告

作者 | 阿文来源 | 程序人生(ID: coder_life)我什么要做这个事情去年单位体检查出问题来&#xff0c;经过穿刺手术确诊是个慢性肾脏病2期&#xff0c; IGA 肾病三期&#xff0c;可能大家对于这个病并不是很了解&#xff0c;但是另外一个词可能大家都听过&#xff0c;叫"尿…

灵动思绪EF(Entity FrameWork)

很久之前就想写这篇文章了&#xff0c;但是由于种种原因&#xff0c;没有将自己学习的EF知识整理成一片文章。今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结。 在讲解EF之前&#xff0c;我们先来看下ORM ORM全称&#xff1a;(Object-Relatio…

json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...

JSON数据采集网关边缘计算智能终端是一种能够将各种传感器仪表仪器设备的数据采集后按照JSON格式上传服务器的网关&#xff0c;可以实现云边协同。JSON(JavaScript Object Notation)是java中的数据格式。例如{“Energy”:”100”, “time”:”22:22:15”}这样的格式&#xff0c…

ABP入门系列(3)——领域层定义仓储并实现

一、先来介绍下仓储 仓储&#xff08;Repository&#xff09;&#xff1a; 仓储用来操作数据库进行数据存取。仓储接口在领域层定义&#xff0c;而仓储的实现类应该写在基础设施层。 在ABP中&#xff0c;仓储类要实现IRepository接口&#xff0c;接口定义了常用的增删改查以及…

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路 首先来个测试 给你们选&#xff0c;答案选啥呢? 正确答案在结尾公布 正确答案是C 为什么呢&#xff1f; 首先&#xff0c;虽然ACL有一个齐总是拒绝的&#xff0c;但是呢&#xff0c;他两都是同一条路由 但是呢&#xff01;&#x…