架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC
从本文标题中可以看出,主要说的是反射技术和控制反转(IOC)技术,本文主要先介绍一下我对这两种技术的理解及它们的优缺点,最后再用实例来说一下使用方法。
反射:可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。这里,它最重要的是“动态性”,即根据条件动态创建“指定类型”的“实例”。
1 // Using GetType to obtain type information: 2 int i = 42; 3 System.Type type = i.GetType(); 4 System.Console.WriteLine(type);
结果是:
System.Int32
本示例使用静态方法 GetType(Object 基类派生的所有类型都继承该方法) 获取变量类型的简单反射实例
1 // Using Reflection to get information from an Assembly: 2 System.Reflection.Assembly o = System.Reflection.Assembly.Load("mscorlib.dll"); 3 System.Console.WriteLine(o.GetName());
结果是:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
本示例使用反射获取已加载的程序集的完整名称
反射一般用在以下情况中:
需要访问程序元数据的属性。linq to sql 中使用很多
执行后期绑定,访问在运行时创建的类型的方法。与工厂模式一起使用,根据配置文件中的类型来动态建立实例
IOC:(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。实现IOC的架构有很多如:Avalon 、Spring、JBoss及Unity等。
理解IOC:可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。
实现非常简单,根据容易名称去创建对象即可
1 /// <summary> 2 /// The static factory of container 3 /// </summary> 4 public sealed class ContainerManager 5 { 6 /// <summary> 7 /// Creates the specified container instance . 8 /// </summary> 9 /// <param name="containerName">Name of the container.</param> 10 /// <returns></returns> 11 public static IContainerContext GetContainer(string containerName) 12 { 13 return new UnityContainerContext(containerName); 14 } 15 }
以下是在实际项目中的使用,IOC架构是用Unity,它的基础代码是:
1 /// <summary> 2 /// The specific container context for Unity 3 /// </summary> 4 public class UnityContainerContext : ContainerContextBase 5 { 6 #region Fields 7 8 /// <summary> 9 /// The lock used for synchronous 10 /// </summary> 11 private static readonly object _synlock = new object(); 12 13 #endregion 14 15 #region Constructor 16 17 /// <summary> 18 /// Initializes a new instance of the <see cref="UnityContainerContext"/> class. 19 /// </summary> 20 /// <param name="name">The name.</param> 21 public UnityContainerContext(string name) 22 : base(name) 23 { 24 } 25 26 #endregion 27 28 #region Properties 29 30 /// <summary> 31 /// Gets the current context. 32 /// </summary> 33 /// <value>The current context.</value> 34 private HttpContext CurrentContext 35 { 36 get 37 { 38 HttpContext context = HttpContext.Current; 39 if (context == null) 40 { 41 throw new Exception("The current httpcontext is null"); 42 } 43 return context; 44 } 45 } 46 47 #endregion 48 49 #region Override Methods 50 51 /// <summary> 52 /// Initializes container. 53 /// </summary> 54 public override void Initialize() 55 { 56 OnBeforeInitialized(new ContainerEventArgs(this, ContainerType.Unity)); 57 58 if (CurrentContext.Application[Name] == null) 59 { 60 lock (_synlock) 61 { 62 if (CurrentContext.Application[Name] == null) 63 { 64 IUnityContainer currentContainer = new UnityContainer(); 65 UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection; 66 section.Containers[Name].Configure(currentContainer); 67 CurrentContext.Application[Name] = currentContainer; 68 } 69 } 70 } 71 72 OnAfterInitialized(new ContainerEventArgs(this, ContainerType.Unity)); 73 } 74 75 /// <summary> 76 /// Resolves this instance. 77 /// </summary> 78 /// <typeparam name="T">Parameter type.</typeparam> 79 /// <returns></returns> 80 public override T Resolve<T>() 81 { 82 try 83 { 84 Initialize(); 85 86 IUnityContainer currentContainer = CurrentContext.Application[Name] as IUnityContainer; 87 return currentContainer.Resolve<T>(); 88 } 89 catch(Exception ex) 90 { 91 OnResolveFailed(new ContainerFailedEventArgs(this, ContainerType.Unity, ex)); 92 return default(T); 93 } 94 } 95 96 /// <summary> 97 /// Tears down. 98 /// </summary> 99 public override void TearDown() 100 { 101 OnBeforeTearDown(new ContainerEventArgs(this, ContainerType.Unity)); 102 103 CurrentContext.Application[Name] = null; 104 105 OnAfterTearDown(new ContainerEventArgs(this, ContainerType.Unity)); 106 } 107 108 #endregion 109 110 }
在项目中通过unity来创建对象的代码是:
1 /// <summary> 2 /// 数据层实体的个性操作对象 3 /// </summary> 4 /// <typeparam name="TEntity"></typeparam> 5 /// <returns></returns> 6 protected TEntity LoadRepositoryEntity<TEntity>() 7 { 8 IContainerContext container = ContainerManager.GetContainer("repositoryContainer"); 9 return container.Resolve<TEntity>(); 10 }
这样,在BLL层调用DAL层对象时,可以通过LoadRepositoryEntity泛型方法来实现。
本文转自博客园张占岭(仓储大叔)的博客,原文链接:架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC,如需转载请自行联系原博主。
架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC相关推荐
- 架构,改善程序复用性的设计~第二讲 什么应该提取出来,什么应该保留
在进行项目整体架构设计时,我们应该明确知道哪些项目是可以被重复再利用的,而哪些项目是与领域模块关系密切的,对于后者我们是应该在解决方案中保留的,而前者则是应该提取出来的. 在一个完整的解决方案中,应该 ...
- 关于提高代码复用性的几个知识点的回顾
在java学习过程中,我发现有几个知识点,它们的作用都包含有提高代码的复用性.所谓提高代码复用性,简单来说就是能够让一个东西重复操作,还能减少工作量(也就是懒人思想).目前提到提高代码复用性的知识点有 ...
- 大中台的黄粱一梦和复用性设计的繁荣盛世
K8s已经成为一线大厂分布式平台的标配技术.你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方图片可了解培训 ...
- Effective C++:改善程序与设计的55个具体做法
Effective C++:改善程序与设计的55个具体做法 二.构造/析构/赋值运算 05 Know what functions C++ silently writes and calls. 06 ...
- 中文版《Effective C++:改善程序与设计的55个具体做法
第一章 从C转向C++ 对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼.因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适.例如,C++ ...
- Effective C++改善程序与设计的55个具体做法笔记
Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...
- 读 S. Meyers 之《Effective C++:改善程序与设计的55个具体做法:第3版》
S. Meyers, 侯捷. Effective C++:改善程序与设计的55个具体做法:第3版. ISBN: 978-7-121-12332-0. 如果说 C 的缺陷能写一本书,那么 C++ 的缺陷 ...
- 相亲交友源码的架构设计,合成复用原则的实现
合成复用原则是指尽量使用对象组合/聚合而不是继承关系达到相亲交友源码复用的目的.可以使相亲交友源码系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少. 继承叫作白箱复用,相当 ...
- 读《重构:改善既有代码的设计》的思考
大家好,你们的简单猿来了. 今天我们聊一下<重构:改善既有代码的设计>这本书.以下简称为 "重构". 1.什么是重构? 按本书中的说法,重构这个概念被分成了动词和名词的 ...
最新文章
- [转载] 财经郎眼20120409:证监会“百日维新”
- Bech32编码 (3)隔离见证地址
- Git的remote
- plsql口令过期_Oracle 11g中密码过期问题详解
- 2.Linux/Unix 系统编程手册(上) -- 基本概念
- Java多线程编程核心技术 (pdf完整版)
- 传统ADC主要指标:SFDR、SNR、SNDR、ENOB
- pyq5 QTreeView 树形目录结构
- matlab2008 软件下载及安装教程
- 英雄联盟轮播图手动轮播
- 我愿称之为:最强播放器!
- 冒泡法java程序图片_正宗冒泡法-java语言实现
- 诱人福利:猎豹移动雇游轮带全员一块儿航海
- 什么样的网站才可以算得上是高端网站设计
- 虚拟主机mysql数据库大小,香港虚拟主机的网站数据库空间不够怎么办
- OpenGL环境的配置(GLUT安装教程)
- FBEC金陀螺奖·侧记 | 七载相伴,致敬创业路上的每一位勇毅前行者!
- [Power]Mockito使用和扩展
- 10倍于以往的传输速度带宽,Bluetooth(蓝牙)4.2标准发布
- 这篇文章,我们来谈一谈Spring中的属性注入
热门文章
- python爬虫----handler和opener
- Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider
- Shell脚本之grep
- 输入框禁止输入emoji标签
- 今日头条架构演进之路——高压下的架构演进专题(含PPT)
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
- HDU 1114 Piggy-Bank 简单DP
- Android Learning:数据存储方案归纳与总结
- Java JDBC工具类
- Nodejs学习笔记(四)——http协议与服务器