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/
Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备的更多相关文章
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-04,实现分页
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-05,实现导航
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
随机推荐
- 斐讯Fir302b救砖教程
首先本人是路由器小白,不算是硬件改装高手,昨天收到了微信活动中的斐讯Fir302b,大概当时得奖的有300人,所以最近肯定很大一批朋友手里有这样的一款路由. 上网查了一下,此款路由可以刷基于tomat ...
- 针对格式文件,Python读取一定大小的文件内容
由数据库导出的数据是格式化数据,如下所示,每两个<REC>之间的数据是一个记录的所有字段数据,如<TITLE>.<ABSTRACT>.<SUBJECT_COD ...
- Cinder 组件详解 - 每天5分钟玩转 OpenStack(47)
本节我们将详细讲解 Cinder 的各个子服务. cinder-api cinder-api 是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 nova-api 处理.cinder ...
- DOM-Document类型
Document类型 JavaScript通过Document类型表示文档.在浏览器中,document对象是HTMLDocument(继承自Document类型)的一个实例,document对象是w ...
- 4、解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制
1.Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2.INCLUDES包含 和我们的Struts2配置文件类似,可以通过includes包 ...
- Javascript正则构造函数与正则表达字面量&&常用正则表达式
本文不讨论正则表达式入门,即如何使用正则匹配.讨论的是两种创建正则表达式的优劣和一些细节,最后给出一些常用正则匹配表达式. Javascript中的正则表达式也是对象,我们可以使用两种方法创建正则表达 ...
- C#多任务并行阶段控制—— Threading.Barrier
有一种场景:4个人同时做某项任务,该任务分为3个阶段,必须要4个人都完成第一阶段后才可以进入第二阶段,都完成第二阶段后才可以进入第三阶段. 此时就需要对多个并行的任务做进度控制. Threading. ...
- golang获取程序运行路径
golang获取程序运行路径: /* 获取程序运行路径 */ func getCurrentDirectory() string { dir, err := filepath.Abs(filepath ...
- Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...