StructureMap 代码分析之Widget 之Registry 分析 (1)
说句实话,本人基本上没用过Structuremap,但是这次居然开始看源码了,不得不为自己点个赞。Structuremap有很多的类,其中有一个叫做Widget的概念。那么什么是Widget呢?要明白什么是Widget,首先必须明白什么是Registry.而Registry又和Structuremap里面的Graph有着千丝万缕的联系。由于自己也才开始接触源码,所以可能有误导大家的地方,大家看看就好,不可盲目相信我说的,好我们先来看看下面这个类。
1 2 3 4 5 6 7 8 9 10 11 12 | public class MyRegistry : Registry { public MyRegistry() { Scan( x => { x.TheCallingAssembly(); x.Convention<MyConvention>(); }); } } |
我们来对上面的代码做一个梳理:首先是MyRegistry继承了Registry,那么当我们使用MyRegistry实例的时候,会自动对MyRegistry所注册的容器里面进行一层“扫描”,其实我觉得大家有必要来看看这个方法:
1 | public void Scan(Action<IAssemblyScanner> action) |
Scan其实是一个带有无返回委托类型的一个Action,这里用到了IAssemblyScanner这个接口,下面我们来看一下这个接口里面到底有什么东西,下面的代码,官方的解释是向Scan操作添加程序集:
1 2 3 | void Assembly(Assembly assembly); void Assembly( string assemblyName); |
为了不陷入代码的圈套,我这里不决定讲太多的方法,就讲上面2个方法的实现好了,AssemblyScanner这个类实现了IAssemblyScanner这个接口,定义了如下全局变量,其中的Assembly是反射有关的类:
1 | private readonly List<Assembly> _assemblies = new List<Assembly>(); |
如果现有程序集不在程序集全局列表里,就添加它
1 2 3 4 5 6 7 | public void Assembly(Assembly assembly) { if (!_assemblies.Contains(assembly)) { _assemblies.Add(assembly); } } |
这里用到了一个Structuremap的另一个类:AsseblyLoader,其实就是做了层封装而已.
1 2 3 4 | public void Assembly( string assemblyName) { Assembly(AssemblyLoader.ByName(assemblyName)); } |
使用了Assembly.load的某个重载函数而已。
1 2 3 4 5 6 7 | public static class AssemblyLoader { public static Assembly ByName( string assemblyName) { return Assembly.Load(assemblyName); } } |
好了,现在我们回到Registry.cs文件当中的Scan方法,下面这句话的意思就是如果当前实例Registry所引用的程序集和Registry所引用的程序集一致的判断:
1 | GetType().GetTypeInfo().Assembly == typeof (Registry).GetTypeInfo().Assembly |
1 2 3 4 5 | //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的实例当中:
1 | internal readonly IList<AssemblyScanner> Scanners = new List<AssemblyScanner>(); |
好了,这篇文章很水很水,但是我还是决定放首页,啦啦啦~~~
__EOF__
作 者:ღKawaii
出 处:https://www.cnblogs.com/kmsfan/p/5065365.html
关于博主:一个普通的小码农,为了梦想奋斗
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!

出处:http://www.cnblogs.com/kmsfan
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
欢迎大家加入KMSFan之家,以及访问我的优酷空间!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?