在这个框架中,我们使用Autofac作为IOC容器,来实现控制反转,依赖注入的目的。

在程序加载的时候,我需要将系统中所有用到的接口与之对应的实现进行装载。由于用户交互部分是在TinyFrame.Web中,并且请求入口是在Application_Start方法中,所以我在这里进行了注入:

   1:  private void RegisterDependency()
   2:          {
   3:              var builder = new ContainerBuilder();
   4:   
   5:              builder.RegisterControllers(Assembly.GetExecutingAssembly());
   6:   
   7:              builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
   8:              builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
   9:   
  10:              builder.RegisterType<BookContext>().As<IDbContext>().SingleInstance().PreserveExistingDefaults();
  11:              builder.RegisterType<ManagerRepository>().As<IManager>().InstancePerHttpRequest();
  12:              builder.RegisterType<BookLendRepository>().As<IBookLend>().InstancePerHttpRequest();
  13:              builder.RegisterType<BookPlaceRepository>().As<IBookPlace>().InstancePerHttpRequest();
  14:              builder.RegisterType<BookRepository>().As<IBook>().InstancePerHttpRequest();
  15:              builder.RegisterType<BookTypeRepository>().As<IBookType>().InstancePerHttpRequest();
  16:              builder.RegisterType<StudentRepository>().As<IStudent>().InstancePerHttpRequest();
  17:   
  18:              builder.RegisterType<ManagerService>().As<IManagerService>().InstancePerHttpRequest();
  19:              builder.RegisterType<BookService>().As<IBookService>().InstancePerHttpRequest();
  20:   
  21:              //builder.RegisterModule(new LogInjectionModule());
  22:              //注册HttpContextBase,在PerRequestCacheManager中使用了。
  23:              //builder.RegisterModule(new AutofacWebTypesModule());
  24:   
  25:              //HTTP context and other related stuff
  26:               builder.Register(c => 
  27:                   //register FakeHttpContext when HttpContext is not available
  28:                   new HttpContextWrapper(HttpContext.Current) as HttpContextBase)
  29:                   .As<HttpContextBase>()
  30:                   .InstancePerHttpRequest();
  31:               builder.Register(c => c.Resolve<HttpContextBase>().Request)
  32:                   .As<HttpRequestBase>()
  33:                   .InstancePerHttpRequest();
  34:               builder.Register(c => c.Resolve<HttpContextBase>().Response)
  35:                   .As<HttpResponseBase>()
  36:                   .InstancePerHttpRequest();
  37:               builder.Register(c => c.Resolve<HttpContextBase>().Server)
  38:                   .As<HttpServerUtilityBase>()
  39:                   .InstancePerHttpRequest();
  40:               builder.Register(c => c.Resolve<HttpContextBase>().Session)
  41:                   .As<HttpSessionStateBase>()
  42:                   .InstancePerHttpRequest();
  43:   
  44:   
  45:              builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").SingleInstance();
  46:              //由于默认会使用PerRequestCacheManager,并且用户每请求一次数据,这个缓存都要重新创建一下。
  47:              //builder.RegisterType<PerRequestCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_per_request").InstancePerHttpRequest();
  48:   
  49:              builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerHttpRequest();
  50:   
  51:              var container = builder.Build();
  52:              DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  53:   
  54:          }

这样我们就能通过构造函数中定义的接口名称,来直接使用其对象了。非常方便。

这里我来解释一下:

第3行:取得容器对象。

第5行:将系统中所有的controller进行注册。

第7行:将系统中的泛型对象和对应的泛型接口进行注册。

第8行:将系统中的对象和对应的接口进行注册。

第10行:类型被多次注册,后面的注册会覆盖前面的,可以通过PreserveExistingDefaults设定默认注册的值。
第45行:如果接口有多个实现,可以通过Named方法为其设置别名。

TinyFrame升级之四:IOC容器的更多相关文章

  1. 【spring源码分析】IOC容器初始化(三)

    前言:在[spring源码分析]IOC容器初始化(二)中已经得到了XML配置文件的Document实例,下面分析bean的注册过程. XmlBeanDefinitionReader#registerB ...

  2. 【spring源码分析】IOC容器初始化(十二)

    前言:在doCreateBean方法中还遗留一个问题没有分析:循环依赖.循环依赖在Spring中是非常重要的一个知识点,因此单独进行分析. 什么是循环依赖 循环依赖就是循环引用,两个或两个以上的bea ...

  3. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  4. IOC容器:Unity

    一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...

  5. 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

    [spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...

  6. 手写IOC容器

    IOC(控制翻转)是程序设计的一种思想,其本质就是上端对象不能直接依赖于下端对象,要是依赖的话就要通过抽象来依赖.这是什么意思呢?意思就是上端对象如BLL层中,需要调用下端对象的DAL层时不能直接调用 ...

  7. 对Spring IOC容器的思考

    最近在看Spring5的视频教学,学到了IOC容器这块,对IOC有些浅薄的理解,分享一二:有错误之处,还请大佬指出 IOC(Inversion of Control 控制反转),是面向对象编程中的一种 ...

  8. 深入 Laravel 内核之IOC容器

    升级工厂前的准备工作 无规矩不成方圆,随着越来越多的行为出现,我们需要需要定下一些规范. 为了约束每一个行为的规范,需要定义一个行为接口: interface BehaviorInterface { ...

  9. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

随机推荐

  1. android Gui系统之SurfaceFlinger(3)---SurfaceFlinger

    7.SurfaceFlinger SurfaceFlinger在前面的篇幅了,多有涉及. SurfaceFlinger是GUI刷新UI的核心,所以任何关于SurfaceFlinger的改进都会对and ...

  2. 发现IE6的一个BUG,添加受信任站点后,页面无法跳转

    最近客户爆了一个问题,说是最近使用我们的系统,一登录浏览器就直接关闭了.   经排查,属于IE6设置受信任站点的问题,受信任站点设置了通配符,如 http://192.168.1.* 这样的格式,而我 ...

  3. iCalendar格式中关于RRule的解析和生成

    最近在做一个关于Calendar的项目,相当于Google Calendar或者Outlook中的Calendar.在Calendar的发布和共享中,使用到了iCalendar,是一种日历数据交换的标 ...

  4. Tomcat 目录详解

     一.文字版本: bin: 该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是 ...

  5. 解决内网主机ping不通网关能ping内网

    有一台笔记本电脑可以自动获取IP,可以和内网其他主机互相PING通,就是PING 不通网关,只能上内网,不能上外网,IP换到其他主机上也可以上外网,说明路由器上没什么限制.路由器也查了,电脑也重装了, ...

  6. html特殊字符的html,js,css写法汇总

    ⇠  箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ &#8672 \u21E0 \21E0 ⇢ &#8674 \u21E2 \ ...

  7. 使用Bootstrap v3.3.4注意细节box-sizing

    一.bootstrap样式 在Bootstrap v3.3.4中有下面一条重置样式: * { -webkit-box-sizing: border-box; -moz-box-sizing: bord ...

  8. What makes an excellent front-end developer?(for my English speech)

    What makes an excellent front-end developer? Let me please start this talking by saying that what is ...

  9. java使用IO读写文件总结

    每次用到IO的读写文件都老忘记写法,都要翻过往笔记,今天总结下,省的以后老忘.java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer:字节:InputStream ...

  10. 洛谷U4807抽水机[最小生成树]

    题目背景 kkk被Farmer John和他的奶牛贝茜虐的很惨,然后她也想体验下一个Farmer的生活.但她又懒得种地,就选择养鱼. 题目描述 这些鱼都是热带鱼(废话),很娇贵(比kkk娇贵),要经常 ...