热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Asp.net面向接口框架之核心容器

新框架的容器部分终于调通了!容器实在太重要了,所有用了一个名词叫“核心容器”。容器为什么那么重要呢?这个有必要好好说道说道。1、首先我们说从框架名称面向接口编程说起,什么是面向接口

新框架的容器部分终于调通了!容器实在太重要了,所有用了一个名词叫“核心容器”。

容器为什么那么重要呢?这个有必要好好说道说道。

1、首先我们说从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下)

技术分享

      解读一下:类是个体的定义(建模), 个体的每一方面都可以是一个接口

      说白点,其一接口可以代表对象(类)一个方面,再说透点对象可能是多面手(继承接口),能在不同场景(作为不同接口的实例)工作

      其二每个接口可以不同实现,只要实现了这个接口,基本上就可以替换这个位置来正常工作

2、我觉得面向接口编程本质上还是面向对象编程

     我们需要一个大的对象库来支持系统的需要,还需要每个位置上的对象方便“随时”替换,扩充

     那我们怎么来管理这个庞大的对象库呢,如何编排以便管理?这里就要说道容器了,容器可以很好的胜任这个工作。

3、容器的作用

  我认为容器就是仓库,就是柜子,就是盒子,以便我们按自己喜欢的方式存放自己的对象,以下需要的时候能方便的找到他们

      好的容器还能维护对象的创建、生命周期、拦截方法执行(AOP)等


前面废话太多,老规矩,先上例子

一、对象的创建和管理由容器负责

1、以下还是前面一篇上下文的例子,使用容器来简化后的代码

技术分享

 以上代码是不是简单漂亮多了

 2、代码虽然简单了,功能一点都没有水分哦,看看以下执行结果截图

技术分享

是不是结果上一篇的完全一样啊。

3、结果一样不算什么,改个配置(不改代码),换个结果试试

技术分享

4、再改配置(还是不该代码)

技术分享

这次生动了吧,一家人各有各的个性了,是不是很炫啊。

5、大家看看配置

技术分享

明眼人一眼就能看出这个是Unity容器的配置;有人说,你不是要不依赖Unity容器吗?我发誓确实没有依赖Unity容器,但我也没说不用Unity啊。我只是要做一个框架,其他技术方案都可以集成进来,容器也是。

你熟悉Unity就用Unity,你熟悉Spring.net也可以放心使用,只要你封装一下并集成这个框架的容器接口,并注册进来

二、使用了Unity容器,但不依赖Unity容器

1、调用容器的地方没有依赖Unity

技术分享技术分享

这个测试项目除了系统的几个引用,就只引用了这个主框架了

2、主框架没有引用Unity容器

技术分享

没骗你们吧?真没依赖Unity,甚至主框架除了几个简单的系统引用,没有依赖(引用)任何第三方组件,但是这一点都不影响我使用大量第三方的库,因为这里是"面向接口框架"

是不是现在又对接口有了进一步的理解了,是不是“面向接口框架”这个名字有点名符其实。

三、下面来解密他到底怎么运行的

1、看入口,看应用程序(这里是控制台程序)的引用

技术分享

哈哈,是不是找到了,这里终于看到Unity引用了

但是不要被表象所迷惑,其实这里的主角是Fang.Unity,因为这个项目可以不直接引用Unity容器,Fang.Unity是对Unity容器的封装。

控制台程序对Unity相关dll是运行时依赖,并不是编译依赖,这里直接引用上是调试方便

2、继续探究原理

Fang.Unity总不会是自动运行的吧?当然不是,上代码

技术分享

上图有一句不起眼,但是非常重要的一行代码“Fang.Unity.ContainerFactory.Init()”,他就是“罪魁祸首”

换句话话说,Unity容器是完全作为插件在本框架中运行的,如果我不调用Unity的Init,调用Spring.net的Init,那当前所有地方用的就是Spring.net的容器。

有人说这也太不方便了吧,当然不是每次使用容器都要调用,如果是web项目可以在global的Application_Start中调用一下就Ok了,也可以在HttpModule的Init中调用也可以。

大部分时候我们在开发中大量使用容器,但并不用想我具体用什么容器。

换句话说,我熟悉Unity容器,我使用Unity容器配置调试通过的组件给你使用,但是你一直都用Spring.net(或者其他容器),你调用Spring.net容器封装,把配置修改为Spring.net的配置,代码一样能正常运行

注:前提是组件开发的时候使用的是框架的容器支持,没有直接引用Unity容器和直接调用Unity容器的代码

3、还是看一眼Fang.Unity.ContainerFactory.Init是什么鬼吧(哈哈,要不睡不着了)

技术分享

Unity容器就不在这里展开,我会单开一篇讲Unity容器和Unity封装等

四、核心容器解析

1、容器相关实现类截图

技术分享

2、核心类图如下:

技术分享

稍作解析各个类的分工:

     A:IContainer接口是定义容器需要的基本功能

技术分享

     B:IContainerFactory定义容器工厂接口

技术分享

     C:GlobalContainer是个静态配置类,提供注册外部容器组件功能及提供调用容器的Api

技术分享

这个是实现容器插件化的关键,这个实现是参考了Asp.net Mvc的DependencyResolver

   D:SimpleContainer提供一个简单和默认的容器和容器工厂实现

  AppContext中的上线文容器就是他实现的,如果不配置扩展容器功能,使用的容器就是他了,但是他其实就是一个字典缓存,存个东西,取个东西,完全没有问题,复杂配置及DI等就没戏了

   E:ContainerWrapper是个容器封装拦截类,拦截容器的操作,以便增加特性和功能

       这个以后再展开讲,里面有一个很有意思的特性

   F:ContainerFactoryCacheWrapper是容器工厂封装及缓存

       也就是外面实现的容器工厂是不用考虑单例模式缓存什么的,他给包办了,而且把每个生产好的容器对象检查和打包好

    太晚了,就写到这里吧。

Asp.net 面向接口框架之核心容器


推荐阅读
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 标题: ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
黄于諭春琪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有