通过Orchard认识的Autofac

反射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. (1)builder.RegisterType().As():注册类型及其实例。例如下面就是注册接口IDAL的实例SqlDAL

C#:

  ContainerBuilder builder = new ContainerBuilder();  
  builder.RegisterType<SqlDAL>().As<IDAL>();  
  IContainer container = builder.Build();  
  SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();
  1. (2)IContainer.Resolve():解析某个接口的实例。
  2. (3)builder.RegisterType().Named(string name):为一个接口注册不同的实例。

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");
  1. (4)IContainer.ResolveNamed(string name):解析某个接口的“命名实例”。
  2. (5)builder.RegisterType().Keyed(Enum enum):以枚举的方式为一个接口注册不同的实例。
  3. (6)IContainer.ResolveKeyed(Enum enum):根据枚举值解析某个接口的特定实例。
  4. (7)builder.RegisterType().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式
  5. (8)builder.RegisterType().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例
  6. (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
posted @ 2014-10-27 16:01  政政糖  阅读(340)  评论(0编辑  收藏  举报