介绍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. Python命令行参数学习

    man python 查看python的帮助文件 命令行参数:       -B     Don't write .py[co] files on import.              See a ...

  2. ylb:事务处理

    ylbtech_sqlserver --1.定义三个变量分别保存你的姓名,年龄和身高,然后赋值并且输出 --DECLARE @name varchar(10) , @age int , @height ...

  3. 泳池水面fresnel 的近似替代

    vs float4 ep = TBMultiply(ModelViewMatrix, FinalPosition); DistFromEye.x = TBSaturate( 10.0 + ep.z / ...

  4. Lock flag DX

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb322846(v=vs.85).aspx discard nooverwrite ...

  5. ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介

    现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...

  6. 基于ruby环境搭建Redmine

    环境说明 系统版本    CentOS 6.9 x86_64 软件版本    ruby 2.4.4 rails 4.2 redmine-3.4.5 Redmine是一个开源的.基于Web的项目管理和缺 ...

  7. java根据身份证号和获取用户年龄和性别的工具类

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util ...

  8. 转: java web demo的示例

    http://quqtalk.iteye.com/blog/360699 从事Java开发已经两年了,但是由于工作的关系,对Java Web还是个freshman.今天做了一个Java Web的简单D ...

  9. cmd.exe启动参数说明

    启动命令解释程序 Cmd.exe 的新范例.如果在不含参数的情况下使用,cmd 将显示操作系统的版本和版权信息. 语法 cmd [{/c | /k}] [/s] [/q] [/d] [{/a | /u ...

  10. 《大话操作系统——做坚实的project实践派》(3)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1ub3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...