.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 帮我们做的

这是一个很简单的入门。

 

posted @ 2017-06-04 14:35  Gress  阅读(185)  评论(0编辑  收藏  举报