本文关注以下方面(环境为VS2012、.Net Framework 4.5以及Unity 3):

  • Ioc/DI简介;
  • Unity简单示例

一、Ioc/DI简介

  IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详细的说明可参见大牛Martin Fowler的强文 http://martinfowler.com/articles/injection.html,借用Hollywood的名言:Don't call us, we'll call you,意即你呆着别动,到时我会找你。控制反转的核心是控制权的转移,从原有的应用程序转移到框架如IoC容器,从而实现模块间的解耦。

  Unity又称Unity Application Block,是微软P&P团队开发的一个轻量级、可扩展的依赖注入容器。它有助于构建松耦合的应用程序和为开发者提供以下便利:

  • 简化对象的创建,特别在分层对象结构和依赖的情形下
  • 它支持需求的抽象化,这允许开发人员在运行时或在配置文件中指定依赖,简化横切关注点(crosscutting concerns)的管理
  • 它通过把组件配置推给容器来决定,增加了灵活性
  • 服务定位能力; 这使客户端能够存储或缓存容器

  关于Unity的详细介绍可移步微软官网 http://msdn.microsoft.com/en-us/library/dn170416.aspx

  

二、Unity简单示例

  以Log日志为例

  首先,简单定义日志接口

namespace PCT.Unity.ConsoleAppSample
{
interface ILog
{
void Log(string message);
}
}

  控制台日志实现类

namespace PCT.Unity.ConsoleAppSample
{
class ConsoleLog : ILog
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
}

添加Unity引用

在搜索框中输入Unity

点击Install即可完成安装。

注册(Register)和使用(Resolve)代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity; namespace PCT.Unity.ConsoleAppSample
{
class Program
{
static void Main(string[] args)
{
//Register
var container = new UnityContainer();
container.RegisterType<ILog, ConsoleLog>(); var logger = container.Resolve<ILog>();
logger.Log("Hello, Unity Application Block"); Console.ReadKey();
}
}
}

运行效果如下:

三、Unity配置文件示例

  代码container.RegisterType<ILog, ConsoleLog>()改成container.LoadConfiguration()即可,当然要包含Microsoft.Practices.Unity.Configuration命名空间,完整的代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration; namespace PCT.Unity.ConsoleAppSample
{
class Program
{
static void Main(string[] args)
{
//Register
var container = new UnityContainer();
//container.RegisterType<ILog, ConsoleLog>();
container.LoadConfiguration(); var logger = container.Resolve<ILog>();
logger.Log("Hello, Unity Application Block"); Console.ReadKey();
}
}
}

修改配置文件如下

<?xml version="1.0"?>
<configuration> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup> <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="PCT.Unity.ConsoleAppSample" />
<namespace name="PCT.Unity.ConsoleAppSample" />
<container>
<register type="ILog" mapTo="ConsoleLog" />
</container>
</unity> </configuration>

运行,发现如下错误

不解,Google之发现configSections节点应该放在第一个位置,其它节点无所谓顺序。

<?xml version="1.0"?>
<configuration> <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="PCT.Unity.ConsoleAppSample" />
<namespace name="PCT.Unity.ConsoleAppSample" />
<container>
<register type="ILog" mapTo="ConsoleLog" />
</container>
</unity> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup> </configuration>

再次运行,一切正常

转自:http://www.cnblogs.com/panchunting/p/Unity_Sample.html

Unity又称Unity Application Block的更多相关文章

  1. Enterprise Library - Data Access Application Block 6.0.1304

    Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简 ...

  2. Enterprise Library 6——Using the Logging Application Block

    原文参考 http://msdn.microsoft.com/en-us/library/dn440731(v=pandp.60).aspx 一.简介 .更重要的是用于审计.这种日志可以跟踪用户的行为 ...

  3. Ubuntu 11.10 安装GMONE3,卸载 UNITY和UNITY 2D

    Ubuntu 11.10安装GNOME3: 1)sudo apt-get install gnome-shell    sudo apt-get install gnome-themes*   (或者 ...

  4. 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:   从上图我们可以 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...

随机推荐

  1. iOS开发-使用宏自定义输出(NSLog)

    前言: 1)输出日志是会大量损耗系统性能 2)输出的信息很容易会被截取到,导致信息不安全. 所以我们会在发行版(Release)取消所有的Log.如果一行一行地去注释掉Log,显然不是一个明确的选择. ...

  2. HDUOJ--8球胜负

    8球胜负 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. ubuntu 安装 LAMP环境

    http://jingyan.baidu.com/article/a681b0de36ad683b18434691.html

  4. pythonl练习笔记——爬虫的初级、中级、高级所匹配的知识

    1 初级爬虫 (1)Web前端的知识:HTML, CSS, JavaScript, DOM, DHTML, Ajax, jQuery,json等: (2)正则表达式,能提取正常一般网页中想要的信息,比 ...

  5. 锻造完美U盘小偷:活用消息机制

    锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...

  6. C# winform 请求http ( get , post 两种方式 )

    一:.Net中有两个类 HttpWebRequest 和HttpWebResponse 类来实现Http的请求 实现步骤: 1.通过WebRequest类创建一个HttpWebRequest的对象,该 ...

  7. redis 基本类型

    1 hashes 类型及操作 redis hash 是一个string 类型的 field 和 value 的映射表.他的添加.删除操作时间复杂度都是 O(1) 2 hset,设置 hash fiel ...

  8. 配置新服务器 的一些 依赖库 php mysql nginx

    利用CentOS Linux系统自带的yum命令安装.升级所需的程序库 LANG=C yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel ...

  9. object-c 获得目录(包括子目录)下所有文件和文件夹路径

    void getAllPathNameInDirectory(vector<string>&filePathList,vector<string>&direct ...

  10. hash和md5

    一.hash和md5 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值. md5 ...