zoukankan      html  css  js  c++  java
  • Unity .NET下的原生Ioc框架

    摘自: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中文资料比较少,今天找到一篇讲配置文件的,有兴趣可以点这里阅读。

  • 相关阅读:
    C#WinForm隐藏窗体关闭按钮的方法
    VPRO工具失败时对输出的一种处理方式
    在linux系统下进行pip升级注意事项
    浏览器遮罩层
    关于手机微信端ios的input不能选中问题解决方案
    微信公众号页面遇到的坑
    移动端微信页面的一些自己爬的坑
    使用JS获取上一页的url地址
    vuejs 入门
    python 学习路程(一)
  • 原文地址:https://www.cnblogs.com/zhuwenlubin/p/2605446.html
Copyright © 2011-2022 走看看