zoukankan      html  css  js  c++  java
  • [原]Unity .NET下的原生Ioc框架,让一部分人先用起来

    偶然的机会,发现微软也出品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中文资料比较少,今天找到一篇讲配置文件的,有兴趣可以点这里阅读。

  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/think8848/p/1319616.html
Copyright © 2011-2022 走看看