原文出自:IOC : Unity 配置和使用

之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同。

我下载了Unity并做了一个简单的测试,项目的分布是这个样子:

LoggerTest.Interface.ILogger 主要是接口, 一个简单的不能再简单的方法结构:

public interface ILogger
{
void Write(string message);
}

LoggerTest 是实现这个接口的project, 恩,跟Terry Lee 的例子一样,实现两个就OK了,分别是FlatFileLogger和DatabaseLogger。

namespace LoggerTest
{
public class FlatFileLogger : ILogger
{
public void Write(string message)
{
Console.WriteLine(String.Format("Message:{0}", message));
Console.WriteLine("Target:FlatFile");
}
} public class DatabaseLogger : ILogger
{
public void Write(string message)
{
Console.WriteLine(String.Format("Message:{0}", message));
Console.WriteLine("Target:Database");
}
}
}

下面是Unity出场的时候了,可能初学者不知道要引用哪些组件(像我就是),这里截个图告诉大家:

如果是显示注入,调用Microsoft.Practices.Unity 和Microsoft.Practices.ObjectBuilder2 就可以了;如果是通过配置文件注入,那么就要另外引用Microsoft.Practices.Unity.Configuration

好了,那么基本上就大功告成,代码里已经注释的很清楚了

    //显式获取UnityContainer
private IUnityContainer GetContainer_Directly()
{
IUnityContainer container = new UnityContainer();
//如果注册多个类型需要指定名字(名字是任意的)
//否则当调用ResolveAll<>()时,那些没有指定名字的将会获取不到
//但是,Resolve<>() 会默认取那些空名字的注入对象。
container.RegisterType<ILogger, DatabaseLogger>("databaseLogger");
container.RegisterType<ILogger, FlatFileLogger>("flatfileLogger");
return container;
} //从配置文件获取UnityContainer
private IUnityContainer GetContainer_Config()
{
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection("unity");
section.Containers[0].Configure(container);
return container;
} public void Test()
{
IUnityContainer container = GetContainer_Config();
foreach (ILogger logger in container.ResolveAll<ILogger>())
logger.Write("Bruce Lee");
}

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container name="One">
<types>
<type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="FlatFileLogger"
mapTo="LoggerTest.FlatFileLogger, LoggerTest"/>
<type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="DatabaseLogger"
mapTo="LoggerTest.DatabaseLogger, LoggerTest"/>
</types>
</container>
</containers>
</unity>
</configuration>

运行效果:

后记:Unity的简单介绍

以下摘自贪睡虫http://www.cnblogs.com/liujian969/archive/2009/01/17/1377446.html

描述

Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。它为开发人员提供了如下好处:

  • 简化了对象的创建,尤其是分层的对象结构和依赖。
  • 允许开发人员在运行时或者配置中指定依赖的需求抽象,以及简化了横切关注点的管理。
  • 服务定位功能允许客户代码保存或者缓存容器。这在开发人员可以持久化容器到 ASP.NET Session 或者 Application 中的 ASP.NET Web 应用程序中特别有用。

常见场景

除了单独解决横切关注点如日志、认证、授权、缓存和异常处理的组件以外,现代业务系统通常由定制的业务对象和在应用程序中完成特殊的或者一般的任务的组件组成。 
成功构建这样的应用程序的关键是获得解耦的或者极度松耦合的设计。松耦合的应用程序更加灵活、更加易于维护。同时在开发期间进行测试,可以模拟对象的桩(轻量级模拟的实现),这增强了实质的依赖。例如,数据库连接、网络连接、ERP 连接和富用户接口组件。 
依赖注入是一种用于构建松耦合应用程序的主要技术。它提供了处理对象间依赖的方法。例如,一个处理用户信息的对象可能依赖于访问数据存储、验证信息和检查用户是否被授权执行更新的其他对象。依赖注入技术可以确保用户类正确的初始化及组装所有这些对象,特别是依赖是抽象的地方。

使用容器可以有很多好处,但它会改变应用程序的设计方式,尤其适合于基于组件的开发,朋友们可以有选择的使用它。

IOC : Unity 配置和使用的更多相关文章

  1. Spring IOC的配置使用(转)

    转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...

  2. Spring学习(4)IOC容器配置bean:定义与实例化

    一.  IOC容器配置 1. 一些概念 (1)IOC容器: 定义:具有管理对象和管理对象之间的依赖关系的容器. 作用:应用程序无需自己创建对象,对象由IOC容器创建并组装.BeanFactory是IO ...

  3. [IOC]Unity使用

    Unity是什么? unity是patterns&practices团队开发的一个轻量级.可扩展的依赖注入容器. Unity特性 1.它提供了创建(或者装配)对象实例的机制,而这些对象实例可能 ...

  4. CQRS学习——IOC,配置,仓储隔离以及QueryEntry[其三]

    从IoC开始说起 博主最早开始用的IoC容器叫AutoFac,那时候用它主要是为了生命周期管理——将EF上下文的生命周期限定为每请求.当然也总是每每听到IoC的好处,但是仍然不能理解其优势.最近在学习 ...

  5. IOC Unity

    1. 依赖倒置原则和IOC2. IOC(Inversion of Control)的好处3. 介绍和使用Unity依赖倒置原则(DIP):上层和下层之间,依赖抽象,而不依赖细节IOC 控制反转,把上端 ...

  6. IoC 之 2.3 IoC的配置使用(叁)

    2.3.1  XML配置的结构 一般配置文件结构如下: <beans> <import resource="resource1.xml"/> <bea ...

  7. 使用微软企业库5.0提供的unity配置解藕系统demo(源码)

    最近公司集50多号开发人员的人力围绕一个系统做开发,框架是免不了要统一的,公司提供的架构,利于分工合作,便于维护,扩展,升级,其中使用了到微软的企业库来解藕系统,只是因为框架封装,于是在网上学习了一个 ...

  8. 开涛spring3(2.3) - IoC的配置使用

    2.3.1  XML配置的结构 一般配置文件结构如下: <beans> <import resource=”resource1.xml”/> <bean id=”bean ...

  9. Unity配置安卓开发环境

    1. 首先要安装JDK,从网上下载即可,我用的版本如下图 注意:此时要保存JDK的路径信息,后面需要使用2. 配置环境变量,计算机右键点属性->高级->环境变量3. 在系统中新建环境变量 ...

随机推荐

  1. Pi Network有梦想是好的,最新消息和下载注册流程。

    (注册流程最下面) ---------------------------------------------------------------------------------- 今日更新(10 ...

  2. BayaiM__ oracle函数_01

    BayaiM__ oracle函数_01   Oracle函数--------------------------------------------------------------------- ...

  3. sleep() 和 wait() 有什么区别:

      ①原理不同. ​ sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒.而wait() ...

  4. Linux system v 共享内存

    system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...

  5. postman---postman发送请求

    前面简单的介绍了Postman的页面介绍和功能介绍,今天我们一起学习postman如何发送请求 发送请求 我们介绍过http协议有多种请求方式,各个请求方法都代表不同的结果.例如,GET使您可以从服务 ...

  6. aa:function()和function aa()

    1.function aa() function aa()是定义的函数 function aa(){var a=5;}var c = aa(); //aa函数已经执行完,c 代表bb变量并没有被收回 ...

  7. 用 FFLIB 实现 Apex 企业设计模式

    Apex 企业设计模式将应用分为服务层.模型层.选择逻辑层.工作单元几个部分.FFLIB 是一个开源的 Apex 框架,可以帮助开发者快速建立相关的功能. FFLIB 的安装 FFLIB 可以直接部署 ...

  8. 【BZOJ3600】没有人的算术(替罪羊树+线段树)

    点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...

  9. Unreal Engine 4 系列教程 Part 10:制作简单FPS游戏

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  10. MySchool题目

    题目: 1.查询所有学生记录,包含年级名称2.查询S1年级下的学生记录 一.项目目录 二.com.myschool.dao 2.1 BaseDao package com.myschool.dao; ...