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


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

    【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/


    <script type="text/javascript"><!-- google_ad_client = "ca-pub-1944176156128447"; /* cnblogs 首页横幅 */ google_ad_slot = "5419468456"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
     
  • 相关阅读:
    第51天 [js] 字符串相连有哪些方式?哪种最好?为什么?
    第52天 [js] 什么是事件委托?它有什么好处?能简单的写一个例子吗?
    np.ndarray与Eigen::Matrix之间的互相转换
    C++向assert加入错误信息
    CeiT:训练更快的多层特征抽取ViT
    CoAtNet: 90.88% Paperwithcode榜单第一,层层深入考虑模型设计
    正式启用Danube 官方站点
    go 编译报错 package embed is not in GOROOT (/usr/local/go/src/embed)
    cloudreve兼容acme.sh脚本
    Git的交叉编译
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7448034.html
Copyright © 2020-2023  润新知