介绍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. RESTful接口签名认证实现机制

    RESTful接口 互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情.但同时也为互联网应用带来了严峻的考验.具体体现在以下几个方面: 1.     部署方式的改变:当用 ...

  2. scp拷贝本地文件到服务器

    拷贝远程服务器的文件到本地:scp -r -P  端口号   用户名@IP地址:/usr/local/tomcat_airc/webapps/        /tmp/kyj/ 拷贝本地文件到远程服务 ...

  3. node - 上传文件并且修改名称

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. laravel性能优化技巧(转)

    说明 性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论. 这里是简单的列表 ...

  5. OS之os.fork()

    有两种方式来实现并发性, 一种方式是让每个“任务"或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域.不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否 ...

  6. Android Studio Gradle项目中加入JNI so文件

    首先在Android Studio(版本号1.2.2)project的app文件夹下创建整个jni文件夹,jni文件夹里写Android.mk.Application.mk以及各类C/C++和汇编源文 ...

  7. TCP/IP协议分析(推荐)

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  8. 解决cp: omitting directory 提示信息

    解决cp: omitting directory 提示信息 执行cp时出现“cp: omitting directory ” 提示信息, 可以使用cp -r 参数来递归拷贝这些文件.

  9. centOS7安装RabbitMQ及python实例

    1.rabbitmq是有erlang开发的,所以首先要先安装erlang rpm -ivh erlang-18.1-1.el7.centos.x86_64.rpm rpm -ivh rabbitmq- ...

  10. 关于javaSocket中 Software caused connection abort: recv failed问题

    在学习Socket中今天突然遇到了以下这种问题 原来是网路连接出了问题,由于我測试的是远程连接所以是在学校的局域网下,结果非常不稳定,開始还以为怎么了一会连上了一会又出现故障然后把IP地址改为本机的1 ...