【声明】由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及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/

Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备的更多相关文章

  1. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  2. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  3. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  4. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  5. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  6. MVC项目实践,在三层架构下实现SportsStore-05,实现导航

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  7. MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. SVM算法

    本文主要介绍支持向量机理论推导及其工程应用. 1 基本介绍 支持向量机算法是一个有效的分类算法,可用于分类.回归等任务,在传统的机器学习任务中,通过人工构造.选择特征,然后使用支持向量机作为训练器,可 ...

  2. ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表

    显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据   目录 ASP.N ...

  3. ajax实现上传文件

      1.html部分 <input style="width: 280px" type="file" name="upLoadProjectPl ...

  4. DOM扩展-Selectors API(选择符 API)、元素遍历

    DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...

  5. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  6. 1Z0-053 争议题目解析175

    1Z0-053 争议题目解析175 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 175.You are peer reviewing a fellow DBAs backup p ...

  7. HTML 网页特效CSS大全

    css属性代码大全一CSS文字属性:color : #999999; /* 文字颜色*/font-family : 宋体,sans-serif; /* 文字字体*/font-size : 9pt; / ...

  8. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  9. .NET环境下基于RBAC的访问控制

    .NET环境下基于RBAC的访问控制 Access Control of Application Based on RBAC model in .NET Environment 摘 要:本文从目前信息 ...

  10. jQuery-1.9.1源码分析系列(四) 缓存系统

    先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...