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/

posted @ 2013-07-09 13:59  dong.net  阅读(5199)  评论(4编辑  收藏  举报