Unity框架入门
介绍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框架入门的更多相关文章
- Unity Shader入门精要读书笔记(一)序章
本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...
- Unity 3D入门简介
最近在刚开始学习Unity 3D,在这里记录一下学习心得和学习笔记,边学边写,可能会比较零散.好了,废话不多说,今天从Unity 3D入门写起,主要简要介绍一下Unity 3D的和一些学习资料.以下如 ...
- Unity Shader入门
Unity Shader入门 http://www.cnblogs.com/lixiang-share/p/5025662.html http://www.manew.com/blog-30559-1 ...
- CI框架入门1
CI框架入门: 1.url的特点 2.目录结构/布局 3.MVC分别在哪里,如何依葫芦画瓢 4.安全性 ...
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...
- CodeIgniter框架入门教程——第一课 Hello World!
本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...
随机推荐
- Python命令行参数学习
man python 查看python的帮助文件 命令行参数: -B Don't write .py[co] files on import. See a ...
- ylb:事务处理
ylbtech_sqlserver --1.定义三个变量分别保存你的姓名,年龄和身高,然后赋值并且输出 --DECLARE @name varchar(10) , @age int , @height ...
- 泳池水面fresnel 的近似替代
vs float4 ep = TBMultiply(ModelViewMatrix, FinalPosition); DistFromEye.x = TBSaturate( 10.0 + ep.z / ...
- Lock flag DX
https://msdn.microsoft.com/en-us/library/windows/desktop/bb322846(v=vs.85).aspx discard nooverwrite ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- 基于ruby环境搭建Redmine
环境说明 系统版本 CentOS 6.9 x86_64 软件版本 ruby 2.4.4 rails 4.2 redmine-3.4.5 Redmine是一个开源的.基于Web的项目管理和缺 ...
- java根据身份证号和获取用户年龄和性别的工具类
import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util ...
- 转: java web demo的示例
http://quqtalk.iteye.com/blog/360699 从事Java开发已经两年了,但是由于工作的关系,对Java Web还是个freshman.今天做了一个Java Web的简单D ...
- cmd.exe启动参数说明
启动命令解释程序 Cmd.exe 的新范例.如果在不含参数的情况下使用,cmd 将显示操作系统的版本和版权信息. 语法 cmd [{/c | /k}] [/s] [/q] [/d] [{/a | /u ...
- 《大话操作系统——做坚实的project实践派》(3)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1ub3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...