zoukankan      html  css  js  c++  java
  • Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备

    【声明】由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害命”)

    【前言】看过本博客的都知道(说得好像是热门博客似的,我真没法控制自己的臭美之情),本人喜欢在进入正题前总会喜欢搞点前奏,那么此文将不会再胡言乱语。马上开始。。。

    【Unity简介】在.NET中是一种非常流行的IoC框架,最新版本为Unity v3。

    【环境】VS2012、.NET Framework 4.5、Unity v3。

    【安装Unity v3】在你的项目中(无则新建Demo),如下图所示,

    在弹出的窗口搜索“Unity”,

    安装完之后可以管理解决方案中的项目是否使用Unity,如下图勾选或取消勾选即可。

    当然也可以直接在官网下载然后引用,这也是之前常用的方式。

    【Coding】我的代码包含一个接口(IRegionFormat)三个类(DefaultRegionFormat、
    DayMonthYearRegionFormat、MonthDayYearRegionFormat),还有一个包含Main方法的类Program。

        public interface IRegionFormat
        {
            string FormatName { get; }
    
            string GetShortTimeString(DateTime time);
        }
    
        public class DefaultRegionFormat : IRegionFormat
        {
            public string FormatName
            {
                get { return "默认时间格式"; }
            }
    
            public string GetShortTimeString(DateTime time)
            {
                return time.ToString("yyyy-MM-dd");
            }
        }
    
        public class DayMonthYearRegionFormat : IRegionFormat
        {
            public string FormatName
            {
                get { return "日月年格式"; }
            }
    
            public string GetShortTimeString(DateTime time)
            {
                return time.ToString("dd/MM/yyyy");
            }
        }
    
        public class MonthDayYearRegionFormat : IRegionFormat
        {
            public MonthDayYearRegionFormat(string s)
            {
                Console.WriteLine("构造函数的参数:{0}", s);
            }
    
            public string FormatName
            {
                get { return "月日年格式"; }
            }
    
            public string GetShortTimeString(DateTime time)
            {
                return time.ToString("MM/dd/yyyy");
            }
        }
    一个接口三个类
            static void Main(string[] args)
            {
                //NoConfigUnity();
                //ConfigUnity();
                ParameterUnity();
                Console.Read();
            }
    
            /// <summary>
            /// 全编码方式注入
            /// </summary>
            static void NoConfigUnity()
            {
                IUnityContainer container = GetRegisterContainer();
                IRegionFormat format1 = container.Resolve<IRegionFormat>();
                WriteFormat(format1);
            }
    
            /// <summary>
            /// 编码方式进行注入,此种方式无需在配置文件进行配置
            /// </summary>
            static IUnityContainer GetRegisterContainer()
            {
                IUnityContainer container = new UnityContainer();
                container.RegisterType<IRegionFormat, DefaultRegionFormat>();
                //container.RegisterType<IRegionFormat, DayMonthYearRegionFormat>();  
                //同一个接口注册两次,将以最后一次注册为准
                return container;
            }
    
            /// <summary>
            /// 通过配置文件进行注入
            /// </summary>
            static void ConfigUnity()
            {
                IUnityContainer container = new UnityContainer();
                UnityConfigurationSection section = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) 
                    as UnityConfigurationSection;
                //section.Configure(container, "defaultContainer");
                section.Configure(container, "DayMonthYearContainer");
                WriteFormat(container.Resolve<IRegionFormat>());
            }
    
            /// <summary>
            /// 构造方法含参数的注入
            /// </summary>
            static void ParameterUnity()
            {
                IUnityContainer container = new UnityContainer();
                UnityConfigurationSection section = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName)
                    as UnityConfigurationSection;            
                section.Configure(container, "MonthDayYearContainer");  //构造函数包含非注入类型参数
                container.RegisterInstance(typeof(string), "string类型注入"); //注册对象,以便于对构造函数调用的参数初始化指定值
                WriteFormat(container.Resolve<IRegionFormat>());
            }
    
            static void WriteFormat(IRegionFormat format)
            {
                if (format != null)
                {
                    Console.WriteLine("格式名称:{0};当前时间:{1}"
                        , format.FormatName, format.GetShortTimeString(DateTime.Now));
                }
            }
    包含Main方法的类Program
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
      </configSections>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
      <unity>
        <containers>
          <container name="defaultContainer">
            <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DefaultRegionFormat,UnityDemo"></register>
          </container>
          <container name="DayMonthYearContainer">
            <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DayMonthYearRegionFormat,UnityDemo"></register>
          </container>
          <container name="MonthDayYearContainer">
            <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.MonthDayYearRegionFormat,UnityDemo"></register>
          </container>
        </containers>
      </unity>
    </configuration>
    配置文件app.config

    代码有注释,就不罗嗦拉。
    【值得注意的是】 1. 注入的接口对象所属的类中包含构造函数,且构造函数包含未进行注入的参数类型(如string,如果非要问还有哪些属于,我的回答是我也不知道,但是只有object类型作为构造函数参数运行时是不报错的),则要进行“RegisterInstance”,如Program类中的ParameterUnity方法所示。

    2. 配置文件是XML格式,切记区分大小写。

    3.Unity 3 帮助文档:http://msdn.microsoft.com/en-us/library/dn170416.aspx

      complex 地址: http://unity.codeplex.com/

  • 相关阅读:
    中型PLC运控快速入门系列教程------第3节 编程语法样例讲解
    中型PLC运控快速入门系列教程------第2节 常用数据类型及变量介绍
    中型PLC运控快速入门系列教程------第1节 学习指南资料介绍
    Inoproshop入门系列教程-----第11节 中型PLC常用快捷方式介绍
    Inoproshop入门系列教程-----第10节 程序安全加密和解锁
    Inoproshop入门系列教程-----第9节 变量关联IO和掉电保持
    Inoproshop入门系列教程-----第8节 中型PLC固件升级方式
    Inoproshop入门系列教程-----第7节 库文件的安装及设备文件的导入
    Inoproshop入门系列教程-----第6节 通信等组态配置介绍
    Inoproshop入门系列教程-----第5节 流水灯样例快速编程上手
  • 原文地址:https://www.cnblogs.com/FreeDong/p/3179443.html
Copyright © 2011-2022 走看看