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 ...
随机推荐
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- 创建 OVS flat network - 每天5分钟玩转 OpenStack(134)
上一节完成了 flat 的配置工作,今天创建 OVS flat network.Admin -> Networks,点击 "Create Network" 按钮. 显示创建页 ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- 使用 Roslyn 编译器服务
.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...
- .NET 对接JAVA 使用Modulus,Exponent RSA 加密
最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...
- AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- [C#] 简单的 Helper 封装 -- CookieHelper
using System; using System.Web; namespace ConsoleApplication5 { /// <summary> /// Cookie 助手 // ...
- iOS UITableView 与 UITableViewController
很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名.项目地址. UITab ...
- javascript高性能编程-算法和流程控制
代码整体结构是执行速度的决定因素之一. 代码量少不一定运行速度快, 代码量多也不一定运行速度慢. 性能损失与代码组织方式和具体问题解决办法直接相关. 倒序循环可以提高性能,如: ...