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测试与调试提示
测试与调试提示 2.1 在交互模式输入一个python语句就会执行一个.在调试程序时,这种模式尤其有用. 2.2 在一个文件调用python解释器后,解释器会在文件中的最后一个语句执行之后推出.然而, ...
- ECShop后台管理菜单修改
ECShop中,和后台菜单相关的文件有两个: ·菜单项:admin\includes\inc_menu.php·菜单文本:languages\zh_cn\admin\common.php 所以,要修改 ...
- linux获取后台进程的控制台数据
linux提供了一个daemon函数,使得进程能够脱离控制台执行,实现了后台执行的效果.可是进程后台执行后,原本在终端控制台输出的数据就看不到了. 那么,如何才干找回这些数据? 这里.文章主题就环绕着 ...
- 微信小程序 - 如何通过button按钮实现分享(转发)功能
小程序官方API https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html#%E9%A1%B5% ...
- 【LeetCode】Sort Colors 数组排序
题目:Sort color <span style="font-size:18px;">/*LeetCode sort colors 题目:输入一个数组.包括0,1,2 ...
- js中数组的合并和对象的合并
1 数组合并 1.1 concat 方法 var a = [1,2,3], b = [4,5,6]; var c = a.concat(b); console.log(c);// 1,2,3,4,5, ...
- TCP/IP详解 卷一(第十七章 TCP:传输控制协议)
与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...
- TCP/IP详解 卷一(第十三章 IGMP:Internet组管理协议)
本章将介绍用于支持主机和路由器进行多播的Internet组管理协议(IGMP) 它让一个物理网络上的所有系统知道主机当前所在的多播组.多播路由器需要这些信息以便知道多播数据报应该向那些接口转发. 跟I ...
- 【Datasatge】使用Datastage装载数据时候,报错:Missing record delimiter “”,saw EOF instead
如题,报错截图如下: 根据以上警告信息我们可以清晰看出,是字段DEFAULT_FLAG出错了!于是我们找到对应的字段,结果一看,导出文件中DS表结构中该字段为DECIMAL(18,2),但是导出文件中 ...
- 后期给项目加入Git版本控制
一.为项目加上Git 1.进入对应文件夹 2.git init(初始化一个空的代码仓库) 3.git add .(将当前目录和子目录的文件标记为要添加到代码仓库) 4.git commit -m &q ...