介绍Unity框架之前,先要说几个概念DIP依赖倒置原则、IOC控制反转、DI依赖注入

DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象; 抽象不依赖于细节,细节应该依赖于抽象。

像这种设计原则的定义,干巴巴的看,很难整明白,必须结合实际例子才能理解;

以人们用华为手机通信为例:

    class HuaWei
{
public void Dial()
{
System.Console.WriteLine("华为手机拨号。。");
}
} class Person
{
private HuaWei phone = new HuaWei(); public void Communicate()
{
phone.Dial();
}
}

在这个例子中,Person属于上层,HUAWEI属于底层,上层依赖于底层,假设底层发生变动,华为手机坏了,需要更换手机进行通信,我们就需要修改Person代码;后面再发生底层变动,Person还需要变化

像这种简单场景下,修改的代价还值得忍受,如果是一个复杂系统,这种频繁变动的代价是昂贵的。

这个时候,我们就需要把变化封装,Person不再依赖于Huwei,而是依赖于抽象接口,HUAWEI也依赖于这个抽象接口。 这就是依赖倒置原则。

    interface IPhone
{
void Dial();
}
class HuaWei:IPhone
{
public void Dial()
{
System.Console.WriteLine("华为手机拨号。。");
}
} class Person
{
private IPhone phone; public Person(IPhone phone)
{
this.phone = phone;
} public void Communicate()
{
phone.Dial();
}
}

还是最初的例子,Person因为依赖于Huwei,需要在Person内部new一个HUAWEI对象才能使用,这种耦合性非常大,IOC就是将new一个Huawei对象的操作交给另外一个容器去处理,我们只是从容器获取这个对象,这就叫控制反转。

DI依赖注入是IOC的实现方式,可以是构造器注入,属性注入,也可以是方法注入

Unity就是.net平台下,开源的IOC框架。

不多说,一步步上代码。

我们以DataBase组件和Log组件为原型,实现Unity框架的演示Demo

namespace UnityLib
{
public interface ILog
{
void WriteLog(string msg); void WriteLog(Exception ex);
}
}

  

    public class ConsoleLog:ILog
{
public void WriteLog(string msg)
{
Console.WriteLine("Console Log" + msg);
} public void WriteLog(Exception ex)
{
Console.WriteLine("Console Log:" + ex.StackTrace);
}
}
  public class FileLog:ILog
{
public void WriteLog(string msg)
{
Console.WriteLine("File Log:" + msg);
} public void WriteLog(Exception ex)
{
Console.WriteLine("File Log:" + ex.StackTrace);
}
}
namespace UnityLib
{
public interface IDataBase
{
void Add();
void Delete(); void Update();
void Query();
}
}
namespace UnityLib
{
public class EFDataBase:IDataBase
{
public void Add()
{
Console.WriteLine("EF Add");
} public void Delete()
{
Console.WriteLine("EF Delete");
} public void Update()
{
Console.WriteLine("EF Update");
} public void Query()
{
Console.WriteLine("EFUpdate");
Console.WriteLine(" Query");
}
}
}
namespace UnityLib
{
public class SQLServerDataBase:IDataBase
{
public void Add()
{
Console.WriteLine("SQLServer Add");
} public void Delete()
{
Console.WriteLine("SQLServer Delete");
} public void Update()
{
Console.WriteLine("SQLServer Update");
} public void Query()
{
Console.WriteLine("SQLServer Query");
}
}
}

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<typeAliases>
<typeAlias alias="IDataBase" type="UnityLib.IDataBase,UnityLib" />
<typeAlias alias="EFDataBase" type="UnityLib.EFDataBase,UnityLib" />
<typeAlias alias="SQLServerDataBase" type="UnityLib.SQLServerDataBase,UnityLib" />
<typeAlias alias="ILog" type="UnityLib.ILog,UnityLib" />
<typeAlias alias="FileLog" type="UnityLib.FileLog,UnityLib" />
<typeAlias alias="ConsoleLog" type="UnityLib.ConsoleLog,UnityLib" />
</typeAliases>
<containers>
<container name="DBcontainer">
<type type="IDataBase" mapTo="EFDataBase" name="EF"></type >
<type type="IDataBase" mapTo="SQLServerDataBase" name="SQLServer"></type >
</container>
<container name="LogContainer">
<type type="ILog" mapTo="FileLog" name="file"></type>
<type type="ILog" mapTo="ConsoleLog" name="console"></type>
</container>
</containers>
</unity>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
</configuration>

客户端代码:

  class Program
{
static void Main(string[] args)
{
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
var logContainer = new UnityContainer();
var dbContainer = new UnityContainer();
section.Configure(logContainer, "LogContainer");
section.Configure(dbContainer, "DBcontainer");
var log = logContainer.Resolve<ILog>("console");
var db = dbContainer.Resolve<IDataBase>("EF");
log.WriteLog("测试信息");
db.Add();
}
}

以上是Unity框架的简单应用,代码没有深入研究,仅作为一个入门供大家参考。

注:以上是Unity3.X。。。

Unity框架入门的更多相关文章

  1. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  2. Unity 3D入门简介

    最近在刚开始学习Unity 3D,在这里记录一下学习心得和学习笔记,边学边写,可能会比较零散.好了,废话不多说,今天从Unity 3D入门写起,主要简要介绍一下Unity 3D的和一些学习资料.以下如 ...

  3. Unity Shader入门

    Unity Shader入门 http://www.cnblogs.com/lixiang-share/p/5025662.html http://www.manew.com/blog-30559-1 ...

  4. CI框架入门1

    CI框架入门: 1.url的特点             2.目录结构/布局             3.MVC分别在哪里,如何依葫芦画瓢             4.安全性             ...

  5. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  6. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  7. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  8. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

  9. CodeIgniter框架入门教程——第一课 Hello World!

    本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...

随机推荐

  1. 报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

    近期在服务器跑大量高负载程序,造成cpu soft lockup.如果确认不是软件的问题. 解决办法: #追加到配置文件中 echo 30 > /proc/sys/kernel/watchdog ...

  2. python 读取CSV文件 中文乱码

    今天读取一个CSV文件,打印出来,中文显示乱码,原因是编码的缘故,CSV保存是编码格式ANSI,解决办法是以记事本方式打开CSV文件,然后另存为时编码选择UTF-8进行保存即可.

  3. Java高级特性—并发包

    1). java并发包介绍 JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的, 主要包含原子量.并发集合.同步器.可 ...

  4. .net 真实代理和透明代理的交互

    .本地代理调用 using System; using System.Runtime.Remoting ; using System.Runtime.Remoting.Services ; using ...

  5. 使用终端shell命令批量改动一个文件下的全部文件的读写权限

    之前对openfire安装的目录就遇到过这个问题,今天再次遇到.须要改动一个目录以下的全部子目录以及文件的三个权限:本用户读写.管理员读写.全部人读写,三个都要需改为wr 步骤例如以下:比如我要改动/ ...

  6. XJTU Summer Holiday Test 1(Brackets in Implications-构造)

    B - Brackets in Implications Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  7. NinePatch

    将图片保存为扩展名为.9.png的格式直接放入Android Studio中的drawable文件夹,拖拉选择拉伸区域,如下图,即可制作出可拉伸背景

  8. Repeater绑定List泛型对象

    后台: public void BindData()        {            List<WeiBo> DataList = new List<WeiBo>(); ...

  9. Delphi 与 C/C++ 数据类型对照表(最新的tokyo)

    更新,下面这table为最新的tokyo基本数据类型与C++的对照关系: Delphi to C++ types mapping   Go Up to Support for Delphi Data ...

  10. Spark中经常使用工具类Utils的简明介绍

    <深入理解Spark:核心思想与源代码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源代码分析>一书正式出版上市 <深入理解Spark:核心思想与源代码分析 ...