摘自:http://www.cnblogs.com/tuyile006/archive/2011/04/07/2008642.html

偶然的机会,发现微软也出品Ioc框架了,属于Microsoft patterns & practices系统的,名字叫Unity(Unity下载地址),考虑可能在手头的项目中会用到,因此下载下来把主要功能做了个测试,感觉马马虎虎,比起Spring好像是挫了点,但是没有办法,很多人有微软洁癖,除了微软的框架其他的用着都觉着不放心,好了,闲话少说,Go!

对了,再废话一句,我不知道Unity的QuickStarts里面怎么净是编程方式下使用Ioc,如果是这样使用Ioc,那么看起来微软是不打算提倡“非侵入式”这个概念了,唉,搞不懂的Microsoft... 又说废话了,本文将介绍如何配置文件方式使用Unity,因为E文太差,Unity的文档只读了一知半解,如果在例子中有错误,请指正。

一.下载Unity,安装...

二.在项目中添加Microsoft.Practices.Unity.dll和Microsoft.Practices.Unity.Configuration.dll的引用。

三.Windows和Console项目请添加App.config文件,Web项目嘛就使用web.config好了,本例将采用Console项目(据说高手都喜欢使用Console,咱不是高手,装一下,嘿嘿~)。

四.使App.config看起来像下面这个样子:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity"
             type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
                 Microsoft.Practices.Unity.Configuration, Version=1.1.0.0,
                 Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <unity>
    <typeAliases>
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity"/>
      <typeAlias alias="ISayHello2" type="Cinlap.Study.UnityDemo.ISayHello2, Cinlap.Study.UnityDemo" />
      <typeAlias alias="SayHello2ACloud" type="Cinlap.Study.UnityDemo.SayHello2ACloud,Cinlap.Study.UnityDemo" />
      <typeAlias alias="SayHello2Think8848" type="Cinlap.Study.UnityDemo.SayHello2Think8848,Cinlap.Study.UnityDemo" />
      <typeAlias alias="ISingletonDemo" type="Cinlap.Study.UnityDemo.ISingletonDemo,Cinlap.Study.UnityDemo" />
      <typeAlias alias="SingletonDemoImpl" type="Cinlap.Study.UnityDemo.SingletonDemoImpl,Cinlap.Study.UnityDemo" />
    </typeAliases>
    <containers>
      <container name="containerOne">
        <types>
          <type type="ISayHello2" mapTo="SayHello2ACloud" name="aCloud"/>
          <type type="ISayHello2" mapTo="SayHello2Think8848" name="think8848"/>
          <type type="ISingletonDemo" mapTo="SingletonDemoImpl" name="singletonDemoImpl" >
            <lifetime type="singleton" />
          </type>
        </types>
        <!--<instances>
        </instances>
        <extensions>
        </extensions>
        <extensionConfig>
        </extensionConfig>-->
      </container>
    </containers>
  </unity>
</configuration>

这里需要解释点,否则就真的有点糊弄人了。

typeAlias节点是给不太容易识记的类型名起一个别名(似乎有点废话),让一个拥有很我字符的类型名“变”短点。

container节点定义管理依赖关系和生命周期的容器(Ioc容器概念),需要在配置中提供一个名称。

type节点从其mapTo属性就可以看出其用途了,它提供依赖关系和生命周期的具体定义。

插播题外话(关于老生常谈):我们考虑这样一个应用场景:经常在设计评审会义上听R&D说:“我在做设计的时候,本来是想到...,结果考虑到项目时间紧张,我就只能先把XX公司的需求做了,没有考虑通用性的问题...”或者:“我本来以为我们的产品运行(安装)环境(流程)不会发生大的变化,没想到...”,往往这时候Boss就会生那些后果不是很严重的气,但是最终往往也只能把希望寄托于下一版本或下一个项目,但是往往下次再把这个过程重复一遍...

题外话续一(关于架构):CSDN上的一篇文章曾给我留下极其深刻的印象:某位CEO说他们的系统运行了四十多年,而支持这个系统寿命的正是合理的系统架构。这句话让我深思了好久,一种什么架构能使一系统具有如此强大的生命力呢?以前看到的基本上都是系统因运行环境或负载变化而被淘汰,很少听说有系统寿命超过十年的,而这个公司的系统居然可以运行四十年以上!!!深思后得出点浅显的结论,这个公司的系统从一开始就运用了合理的架构,遵循了适时的正确的设计理论,因此,过程很轻易的演化为对象,对象很轻易的又演化为组件,组件又很轻易的演化为服务(也许它就是走了这样一个路线吧)。因此,我暗下决心,不再在我的设计过程加入那些自以为是的假设:不可能跨平台移植、不可能扩展功能、不可能负载增加、不可能...

题外话续二(关于Ioc):有人可能会问,需求发生了变化后我可以重新写代码呀?我有丰富的控(组)件、我有强大的IDE,我针对客户新的需求修改现在的系统用不了多长时间...没错,肯定没错,绝对没错,本文不适合你。也有人可能问,Ioc看起来和Factory没什么区别呀,为什么还要花时间去学习它呢,Factory的确很棒,以前我也曾以掌握Factory模式沾沾自喜,但后来总发现Factory缺点什么,为什么当实例类型变化时还要去打开项目修改源代码呢?又有人说了,你不会使用配置文件么?配置文件?听起来不错,可是...可是如果我要任意的实现Singleton或是指定Instance初始值或是...又怎么办呢?Ioc框架组有人已经偷着笑了,小样,早让你们用我们的产品了吧...

题外话结束。

五.新建一个项目,在里面加入如下几个文件:

ISayHello2.cs

    public interface ISayHello2
    {
        string SayHello();
    }

SayHello2Think8848.cs

public class SayHello2Think8848 : ISayHello2
    {
        #region ISayHello2 成员

public string SayHello()
        {
            return "Hello think8848!";
        }

#endregion
    }

SayHello2ACloud.cs

public class SayHello2ACloud : ISayHello2
    {
        #region ISayHello2 成员

public string SayHello()
        {
            return "Hello aCloud!";
        }

#endregion
    }

ISingletonDemo.cs

    public interface ISingletonDemo
    {
        DateTime GetInitTime();
    }

SingletonDemoImpl.cs

public class SingletonDemoImpl : ISingletonDemo
    {
        private DateTime time;

public SingletonDemoImpl()
        {
            this.time = DateTime.Now;
        }

#region ISingletonDemo 成员

public DateTime GetInitTime()
        {
            return this.time;
        }

#endregion
    }

六.修改Console的Program.cs文件,使Main方法看起来像下面的样子:

static void Main()
        {
            UnityContainer myContainer = new UnityContainer();
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Containers["containerOne"].Configure(myContainer);

ISayHello2 sayHello2aCloud = myContainer.Resolve<ISayHello2>("aCloud");
            ISayHello2 sayHello2Think8848 = myContainer.Resolve<ISayHello2>("think8848");

Console.WriteLine(sayHello2aCloud.SayHello());
            Console.WriteLine(sayHello2Think8848.SayHello());

Console.WriteLine("");
            Console.WriteLine("Singleton Demo");
            ISingletonDemo singletonDemo1 = myContainer.Resolve<ISingletonDemo>("singletonDemoImpl");
            Console.WriteLine("SingletonDemoImpl1 created: {0},SingletonDemoImpl1.GetInitTime() result is{1}:", new object[]{DateTime.Now.ToString(),singletonDemo1.GetInitTime().ToString()});

Thread.Sleep(1000);
            ISingletonDemo singletonDemo2 = myContainer.Resolve<ISingletonDemo>("singletonDemoImpl");
            Console.WriteLine("SingletonDemoImpl2 created: {0},SingletonDemoImpl2.GetInitTime() result is{1}:", new object[] { DateTime.Now.ToString(), singletonDemo1.GetInitTime().ToString() });

Console.ReadLine();
        }

七.F5一下。

结果:

本文仅示例了Unity最基本的最常用的功能,其他功能待续。

Unity中文资料比较少,今天找到一篇讲配置文件的,有兴趣可以点这里阅读。

转载于:https://www.cnblogs.com/zhuwenlubin/archive/2012/07/23/2605446.html

Unity -- .NET下的原生Ioc框架相关推荐

  1. .NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能

    一.前言 ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方 ...

  2. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

  3. .NET领域最为流行的IOC框架之一Autofac

    一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也是用的Autofac. Orchad和Nopcomm ...

  4. Unity应用架构设计(7)——IoC工厂理念先行

    一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂.IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常卓越的的控制反转.依赖注入框架.遗憾的是, ...

  5. 教你打造 Android 中的 IOC 框架

    1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量, ...

  6. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...

  7. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  8. Quarkus:一个Kubernetes原生Java框架

    Red Hat发布了Quarkus,这是一个为GraalVM和OpenJDK HotSpot量身定制的Kubernetes原生Java框架.Quarkus的目标是使Java成为Kubernetes和无 ...

  9. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

最新文章

  1. python画树叶-用python画树叶
  2. python大一考试_python 考试补缺
  3. php ora-12154,ORA-12154 和 TNS-03505 监听错误的解决方法
  4. grafana zabbix 模板_【Grafana教程】安装Grafana并配置Zabbix数据源
  5. C#创建单链表,翻转单链表
  6. c语言程序设计5pdf,C语言程序设计5.pdf
  7. JSLIU 的 wxWindows 入门
  8. Spring Boot整合ehcache的详细使用
  9. Gradle教程——(二)Gradle介绍
  10. C64+系列DSP的总结
  11. clion ros debug clion配置ros环境及调试
  12. 【史玉柱自述:我的营销心得】-成功的牛人其实都有许多你不知道的技能
  13. ctfshow(菜狗杯)
  14. 注册快手提示服务器繁忙,快手登录失败怎么回事
  15. golang内幕之协程状态切换
  16. CodeIgniter 源码解读之模型
  17. c++封装so库,供安卓android调用
  18. 去掉数组中重复出现元素的算法
  19. 【转载】磁盘空间引起ES集群shard unassigned的处理过程
  20. SCSI协议及大容量存储命令详解

热门文章

  1. mysql 客户端乱码_Mysql客户端中文乱码问题解决
  2. go 递归tree关系_Go实现一个二叉搜索树
  3. cherokee php,CentOS安装最快Web服务器Cherokee+MySQL+PHP
  4. 用计算机用图解法求理论塔板数,用Excel图解法求精馏塔理论塔板数.pdf
  5. android8.0自适应图标,适配8.0+的自适应图标
  6. SpringSecurity Basic Authentication
  7. 2.1 Mini-batch 梯度下降法
  8. opencv 轮廓特征
  9. Excel Txt 字符集设置
  10. C语言scanf函数详解和示例