zoukankan      html  css  js  c++  java
  • 通过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
  • 相关阅读:
    Android(java)学习笔记6:实现Runnable接口创建线程 和 使用Callable和Future创建线程
    Android(java)学习笔记5:线程的生命周期
    Android(java)学习笔记4:线程的控制
    Android(java)学习笔记3:线程的优先级
    Android(java)学习笔记2:继承Thread类创建线程类
    凑算式
    三洋献瑞
    三洋献瑞
    三洋献瑞
    移动距离
  • 原文地址:https://www.cnblogs.com/mqgh/p/4054420.html
Copyright © 2011-2022 走看看