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优化.导航.分页.购物车.订单.产品管 ...
随机推荐
- 前端MVVM框架设计及实现(二)
在前端MVVM框架设计及实现(一)中有一个博友提出一个看法: “html中使用mvvm徒增开发成本” 我想这位朋友要表达的意思应该是HTML定义了大量的语法标记,HTML中放入了太多的逻辑,从而增加了 ...
- OpenCascade MeshVS Usage
OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...
- MVC4做网站后台:栏目管理1、添加栏目
把栏目添加删除跟前台混在一起结构清晰,现在有了后台管理的区域就把后台管理相关的代码分开. 要实现功能: 1.添加栏目 2.删除栏目 3.修改栏目信息 -- 一.开始 1.添加 接口InterfaceC ...
- 前端学PHP之文件操作
× 目录 [1]文件类型 [2]文件属性 [3]目录路径[4]目录遍历[5]目录统计[6]目录增删[7]目录复制[8]文件操作[9]文件内容 前面的话 在程序运行时,程序本身和数据一般都存在内存中,当 ...
- AngularJS之WebAPi上传(十)
前言 前面一系列我们纯粹是讲AngularJS,在讲一门知识时我们应该结合之前所学综合起来来做一个小的例子,前面我们讲了在MVC中上传文件的例子,在本节我们讲讲如何利用AngularJS在WebAPi ...
- Android自定义Dialog(美化界面)
前言:在做项目的时候,发现dialog界面太丑陋,从csdn上下载了一份自定义dialog的源码,在他的基础上对界面进行美化...有需要的朋友可以直接拿走 效果图如下: 主要代码: /** * 自定义 ...
- 升级到Windows10
1.Windows10的优点 2.需要安装的软件 实用软件: Firefox浏览器 Chrome浏览器 有道云笔记 Adobe Reader Adobe Flash Adobe PhotoShop 编 ...
- php创建新用户注册界面布局实例
php创建新用户注册界面布局实例 <!DOCTYPE> <html> <head> <title>Load page</title> < ...
- 《selenium2 Java 自动化测试实战(第二版)》 更新2016.5.3
java 版来了!! 本文档在<selenium2 Python 自动化测试实战>的基础上,将代码与实例替换为java ,当然,部分章节有变更.这主要更语言本身的特点有关.集合和java下 ...
- c3p0数据库连接池的使用详解
首先,什么是c3p0?下面是百度百科的解释: C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Sp ...