反射Reflection
这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。
- 类似于早绑定与晚绑定的关系,晚绑定损耗效率,但可以提高程序的利用性和灵活性,并且能够带来设计上的便利。
- 应用:
- 通过反射获取类型;
- type.GetInterface("ITest")
- Type.GetType("System.String")
- Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
- 通过反射来遍历对象属性;
- 通过反射获取类型;
C#:
Test1 test = new Test1();
test.Id = 1;
test.Name = "语文";
test.Score = 87.5;
foreach (System.Reflection.PropertyInfo pi in test.GetType().GetProperties())
{
Console.WriteLine(pi.Name + ":" + pi.GetValue(test, null).ToString() + "<br />");
}
关于IOC和DI的理解
-
依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念)。
DIP:依赖倒置原则,高层模块定义接口,低层模块负责实现。
-
控制反转(IoC):一种反转流、依赖和接口的方式(DIP的具体实现方式)。
IOC:Inversion of Control 控制反转,不是什么技术,是一种设计模式,为了解耦
-
依赖注入(DI):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)。
DI:Dependency Injection 依赖注入
-
IoC容器:依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架)。
比较官方的语言:应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。ioc
http://www.2cto.com/kf/201407/321182.html
AutoFac常用方法说明http://www.cnblogs.com/WeiGe/p/3871451.html
- (1)builder.RegisterType
C#:
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<SqlDAL>().As<IDAL>();
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();
- (2)IContainer.Resolve
():解析某个接口的实例。 - (3)builder.RegisterType
C#:
builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");
- (4)IContainer.ResolveNamed
(string name):解析某个接口的“命名实例”。 - (5)builder.RegisterType
- (6)IContainer.ResolveKeyed
(Enum enum):根据枚举值解析某个接口的特定实例。 - (7)builder.RegisterType
().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式 - (8)builder.RegisterType
().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例 - (9)IContainer.Resolve
(NamedParameter namedParameter):在解析实例T时给其赋值
DBManager manager = container.Resolve(new NamedParameter("name", "SQL"));
通过配置的方式使用AutoFac http://developer.51cto.com/art/201407/446711_all.htm
C#:
static void Main(string[] args)
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<DBManager>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
using (IContainer container = builder.Build())
{
DBManager manager = container.Resolve<DBManager>();
manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
}
autofac是.net一种最流行的依赖注入的框架,最终目标是为了解耦,直接切入点就是以接口编程为主导思想,杜绝类之间的耦合,以反射技术为基础,把依赖注入到相应的对象中。
属性注入
- 使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件,也有很多支持属性注入。
- 对于一些使用特频繁的类或者方法,很多类都会用到,那么使用属性注入会节省更多的力气,而且在设计的时候就可以提早的把该属性给定义出来。
- http://www.cnblogs.com/n-pei/p/3417891.html