StructureMap 代码分析之Widget 之Registry 分析 (1)
说句实话,本人基本上没用过Structuremap,但是这次居然开始看源码了,不得不为自己点个赞。Structuremap有很多的类,其中有一个叫做Widget的概念。那么什么是Widget呢?要明白什么是Widget,首先必须明白什么是Registry.而Registry又和Structuremap里面的Graph有着千丝万缕的联系。由于自己也才开始接触源码,所以可能有误导大家的地方,大家看看就好,不可盲目相信我说的,好我们先来看看下面这个类。
public class MyRegistry : Registry
{
public MyRegistry()
{
Scan(
x =>
{
x.TheCallingAssembly();
x.Convention<MyConvention>();
});
}
}
我们来对上面的代码做一个梳理:首先是MyRegistry继承了Registry,那么当我们使用MyRegistry实例的时候,会自动对MyRegistry所注册的容器里面进行一层“扫描”,其实我觉得大家有必要来看看这个方法:
public void Scan(Action<IAssemblyScanner> action)
Scan其实是一个带有无返回委托类型的一个Action,这里用到了IAssemblyScanner这个接口,下面我们来看一下这个接口里面到底有什么东西,下面的代码,官方的解释是向Scan操作添加程序集:
void Assembly(Assembly assembly); void Assembly(string assemblyName);
为了不陷入代码的圈套,我这里不决定讲太多的方法,就讲上面2个方法的实现好了,AssemblyScanner这个类实现了IAssemblyScanner这个接口,定义了如下全局变量,其中的Assembly是反射有关的类:
private readonly List<Assembly> _assemblies = new List<Assembly>();
如果现有程序集不在程序集全局列表里,就添加它
public void Assembly(Assembly assembly)
{
if (!_assemblies.Contains(assembly))
{
_assemblies.Add(assembly);
}
}
这里用到了一个Structuremap的另一个类:AsseblyLoader,其实就是做了层封装而已.
public void Assembly(string assemblyName)
{
Assembly(AssemblyLoader.ByName(assemblyName));
}
使用了Assembly.load的某个重载函数而已。
public static class AssemblyLoader
{
public static Assembly ByName(string assemblyName)
{
return Assembly.Load(assemblyName);
}
}
好了,现在我们回到Registry.cs文件当中的Scan方法,下面这句话的意思就是如果当前实例Registry所引用的程序集和Registry所引用的程序集一致的判断:
GetType().GetTypeInfo().Assembly == typeof(Registry).GetTypeInfo().Assembly
//Scanner数量+1
scanner.Description = "Scanner #" + (Scanners.Count + 1); //某个类别的Scanner加1
scanner.Description = "{0} Scanner #{1}".ToFormat(GetType().Name, (Scanners.Count + 1));
注意以下Scan方法里面的action(xxx),xxx这里指的是方法名,并且是无返回值的方法(基础知识,温习一下),然后再把当前的scanner添加进全局的Registry的实例当中:
internal readonly IList<AssemblyScanner> Scanners = new List<AssemblyScanner>();
好了,这篇文章很水很水,但是我还是决定放首页,啦啦啦~~~
StructureMap 代码分析之Widget 之Registry 分析 (1)的更多相关文章
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- 8、SpringMVC源码分析(3):分析ModelAndView的形成过程
首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...
- 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解
从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...
- Solr4.8.0源码分析(5)之查询流程分析总述
Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilt ...
- NIO 源码分析(05) Channel 源码分析
目录 一.Channel 类图 二.begin 和 close 是什么 2.1 AbstractInterruptibleChannel 中的 begin 和 close 2.2 Selector 中 ...
- NIO 源码分析(02-2) BIO 源码分析 Socket
目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...
- NIO 源码分析(02-1) BIO 源码分析
目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...
随机推荐
- ASP.NET Core 之 Identity 入门(二)
前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就 ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
- JavaScript function函数种类
本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- 根据ip判断返回城市名称查询当地天气
<?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...
- 注释生成Api文档
1.开发背景 最近一直在写dubbo接口,以前总是用word文档写接口描述然后发给别人.现在太多了,而且跟别人对接联调的人家急着用,根本没时间去写word文档.那就想想怎么用doc文档注释自动生成接口 ...
- git添加GitHub远程库
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作 首先,登陆GitHub, ...
- SQL-union
集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定.(可以用来连接多个结果)联合(union)与连接(jo ...