说句实话,本人基本上没用过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)的更多相关文章

  1. linux内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  2. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  3. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  4. 8、SpringMVC源码分析(3):分析ModelAndView的形成过程

    首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...

  5. 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

    从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...

  6. Solr4.8.0源码分析(5)之查询流程分析总述

    Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilt ...

  7. NIO 源码分析(05) Channel 源码分析

    目录 一.Channel 类图 二.begin 和 close 是什么 2.1 AbstractInterruptibleChannel 中的 begin 和 close 2.2 Selector 中 ...

  8. NIO 源码分析(02-2) BIO 源码分析 Socket

    目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...

  9. NIO 源码分析(02-1) BIO 源码分析

    目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...

随机推荐

  1. 为C# as 类型转换及Assembly.LoadFrom埋坑!

    背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...

  2. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  3. SQL Server-聚焦计算列或计算列持久化查询性能(二十二)

    前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...

  4. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  5. Solr 排除查询

    前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...

  6. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  7. golang sync.WaitGroup bug

    注意,这个结构体,要是想在函数之间传来传去的话,必须要使用指针....... 这个结构体里没有 指针,这个类型可以说没有“引用特性”. 被坑了一晚上.特此记录.

  8. 热修复-Nuwa学习篇

    nuwa热修复是基于qq空间团队的思路,最近的热度话题了,很多种方案,自己先研究几种方案,基本上都各有优势,学习肯定得先挑个软柿子捏了,自己对比了一下,发现nuwa代码量少点,所以就决定了,先研究nu ...

  9. ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)

    ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...

  10. Open-Test 测试驱动模式与版本号管理机制

    以测试用例驱动项目开发,coding/case俩条线并走模式.   1.开发人员只负责功能实现:   2.测试人员提供自测用例,研发人员jenkins持续集成项目后自动化执行自测用例,通过后方可转测试 ...