c# 依赖注入之---反射(转)

详细请看http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html

定义一个接口,和两个类(实现该接口)

IButton:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace ReflectionInjection
 8 {
 9     internal interface IButton
10     {
11         string ShowInfo();
12     }
13 }

WindowsButton:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace ReflectionInjection
 8 {
 9     internal sealed class WindowsButton : IButton
10     {
11         public string Description { get; private set; }
12         public WindowsButton()
13         {
14             this.Description = "Windows风格按钮";
15         }
16         public string ShowInfo()
17         {
18             return this.Description;
19         }
20     }
21 }

MacButton:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionInjection
{
    internal sealed class MacButton : IButton
    {
        public String Description { get; private set; }
        public MacButton()
        {
            this.Description = " Mac风格按钮";
        }
        public string ShowInfo()
        {
            return this.Description;
        }
    }
}

ReflectionFactory:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ReflectionInjection
{
    internal static class ReflectionFactory
    {
        private static string _buttonType;
        static ReflectionFactory()
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Environment.CurrentDirectory + "\\Config.xml");
            XmlNode xmlNode = xmlDoc.ChildNodes[1].ChildNodes[1];
            _buttonType = xmlNode.ChildNodes[0].Value;

        }
        public static IButton MakeButton()
        {
            return Assembly.Load("ReflectionInjection").CreateInstance("ReflectionInjection." + _buttonType) as IButton;
        }
    }
}

主入口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionInjection
{
    class Program
    {
        static void Main(string[] args)
        {
            //ReflectionFactory
            IButton button = ReflectionFactory.MakeButton();
            Console.WriteLine("创建 " + button.ShowInfo());
            Console.ReadLine();
        }
    }
}

xml:

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <window>MacWindow</window>
  <button>MacButton</button>
  <textBox>MacTextBox</textBox>
</config>
时间: 2024-10-26 14:51:18

c# 依赖注入之---反射(转)的相关文章

大话spring. net之依赖注入

谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny Injection)简称DI,目前DI是最优秀的解耦方式之一.下面我就来谈谈依赖注入的应用场景. 我模拟了三种不同的场景,可以一起学习使用依赖注入的重要性. 下面是应用场景的条件:人类使用工具劳动.     /// <summary>     /// 抽象人类     /// </summary&g

话说 依赖注入(DI) or 控制反转(IoC)

首页 下载 扩展 应用 教程 代码 案例 资讯 讨论 全部 搜索 话说 依赖注入(DI) or 控制反转(IoC) 浏览:3641 发布日期:2014/03/20 分类:技术分享 科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描

Spring.Net学习笔记五(依赖注入)

谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny Injection)简称DI,目前DI是最优秀的解耦方式之一.下面我就来谈谈依赖注入的应用场景. 我模拟了三种不同的场景,可以一起学习使用依赖注入的重要性. 下面是应用场景的条件:人类使用工具劳动.      /**//// <summary> /// 抽象人类 /// </summary>

反射机制、依赖注入、控制反转

反射机制 正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之. 反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法. 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码. 反射是.Net中获取 运行时类型信息的方式,.Ne

基于反射的通过set方法的依赖注入,可以看成一种设计模式,自己来用

非常好用,在properties文件中配置字符串和类名之间的对应,在程序里读取文件,找到类名,通过反射,达到调用set方法的目的,然后直接将自己的指向其他类的对象的引用赋值,指向实体对象. 比如userservice类,(当然spring用这个方法依赖注入好了,但是会这个原理,可以在某些时候方便自己用) 有一个userDao要注入,可以让userservice继承一个baseService类,在baseService类的构造方法中,定义一个反射方法,这样每次实例化userService的时候,它

[javascript] 反射与依赖注入!

对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply 方法,对回调进行调用即可,一般如下操作: 首先定义两个方法: var service = function() { return { name: 'Service' }; } var router = function() { return { name: 'Router' }; } 我们有另一个函数需要用到这两个模块. var doSomething = functio

采用dom4j和反射模拟Spring框架的依赖注入功能

Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面是具体的步骤: 第一步,编写配置文件.配置文件的书写,采用了和Spring的配置文件applicationContext.xml一样的书写规则: <?xml version="1.0" encoding="UTF-8"?> <!-- applicati

laravel中如何利用反射实现依赖注入

依赖注入 在一个类中经常会依赖于其他的对象,先看一下经典的写法 class Foo { public $bar; public function __construct() { $this->bar = new Bar(); } } $foo = new Foo(); 当类的依赖发生改变时,比如 Bar 这个类需要实例化参数时,而依赖于它的类有很多,总不能一个一个地去修改吧. 再看一下使用 依赖注入 怎么做 class Foo { public $bar; public function __c

iOS控制反转(IoC)与依赖注入(DI)的实现

背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大的方便,要在OC上较好的实现这两个功能,需要一些小小的技巧. 控制反转和依赖注入 控制反转 简单来说,将一个类对象的创建由手动new方式改为从IOC容器内获取,就是一种控制反转,例如我们现在要创建一个ClassA类,则常规方法为 ClassA *a = [ClassA new]; 如果使用控制反转,