zoukankan      html  css  js  c++  java
  • .net Ioc 之 Unity 适合刚开始使用

    介绍:

    首先稍微介绍一下,Unity是微软patterns& practices组用C#实现的轻量级、可扩展的依赖注入容器,可通过代码或xml配置文件来配置对象之间的关系。那么通过一个简单的代码来实现。

    测试项目详细

    1、新建一个控制台项目叫UnityDemo

    2、建立一个接口IProduct,包括一个属性(string ClassName{get;set;}),一个方法(void ShowInfo())

    3、建立两个类Milk,Sugar,并且继承IProduct,两个类实现代码如下:

    public class Milk : IProduct
        {
            public string ClassName { get; set; }
    
            public void ShowInfo()
            {
                Console.WriteLine("milk:{0}",ClassName);
            }
        }
    

      

    public class Sugar : IProduct
        {
            public string ClassName { get; set; }
            public void ShowInfo()
            {
                Console.WriteLine("sugar:{0}", ClassName);
            } 
        }
    

      

    开始测试

    1、使用Unity需要引用三个dll,也可以使用Nuget获取

    2、前面有提到,使用Unity有两种方式,我们先使用代码来控制

        a、新建一个静态方法ContaninerCode,需要引用Microsoft.Practices.Unity代码如下:

    static void ContainerCode()
            {
                //创建Unity实例
                IUnityContainer container = new UnityContainer();
    
                //默认注册(无命名)
                container.RegisterType<IProduct, Milk>();
                //命名注册
                container.RegisterType<IProduct, Sugar>("Sugar");
    
                //解析默认对象
                IProduct _product = container.Resolve<IProduct>();
                _product.ClassName = _product.GetType().ToString();
                _product.ShowInfo();
    
                //指定命名解析对象
                IProduct _Sugar = container.Resolve<IProduct>("Sugar");
                _Sugar.ClassName = _Sugar.GetType().ToString();
                _Sugar.ShowInfo();
    
                //获取容器中所有的IProduct注册的已命名对象(不包含默认注册)
                IEnumerable<IProduct> classList = container.ResolveAll<IProduct>();
    
                foreach (var item in classList)
                {
                    item.ClassName = item.GetType().ToString();
                    item.ShowInfo();
                }
            }
    

      运行结果如下:

    3、使用配置文件实现

        a、根目录新建Unity.config,属性选择复制到生成目录,配置文件内容如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      
      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
      </configSections>
      
      <unity>
        <!--定义别名-->
        <aliases>
          <add alias="Iproduct" type="UnityDemo.IProduct,UnityDemo"/>
          <add alias="Milk" type="UnityDemo.Milk,UnityDemo"/>
          <add alias="Sugar" type="UnityDemo.Sugar,UnityDemo"/>
        </aliases>
        
        <!--容器-->
          <container name="MyContainer">
            <!--开始映射关系-->
            <register type="Iproduct" mapTo="Milk"></register>
            <register type="Iproduct" mapTo="Sugar" name="Sugar"></register>
          
          </container>
      </unity>
      
    </configuration>
    

      b、创建静态方法ContainerCodeForConfig()加载配置文件,需要引用dll,Practices.Unity.Configuration、System.Configuration代码如下:

    static void ContainerCodeForConfig()
            {
                //创建Unity实例
                IUnityContainer container = new UnityContainer();
    
                string configFile = "Unity.config";
                var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
    
                //读取指定config文件
                Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
    
                //获取指定名称的节点
                UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity");
                //获取容器节点
                container.LoadConfiguration(section, "MyContainer");
    
                IProduct p = container.Resolve<IProduct>("Sugar");
                p.ClassName = p.GetType().ToString();
                p.ShowInfo();
            }

    运行结果如下:

    可以看到 我们并没有创建IProduct、Sugar类,但是能调用其方法,这是Ioc 帮我们做的

    这是一个很简单的入门。

  • 相关阅读:
    [Caffe] ubuntu14.04下使用OpenBLAS加速Caffe
    [CUDA] ubuntu14.04+cuda7.5下安装cudnn7.0
    ubuntu下virtualenv的复制
    SIFT特征学习笔记
    ubuntu14.04+opencv 3.0+python2.7安装及测试
    django之ORM
    django之路由(url)
    性能调优之MySQL篇四:MySQL配置定位以及优化
    性能调优之MySQL篇三:MySQL配置定位以及优化
    性能调优之MySQL篇二:MySQL配置文件My.ini配置文件优化
  • 原文地址:https://www.cnblogs.com/gress/p/6940467.html
Copyright © 2011-2022 走看看