依賴注入入門——Unity(二)
參考博客文章http://www.cnblogs.com/kebixisimba/category/130432.html
http://www.cnblogs.com/qqlin/tag/Unity/
依赖注入容器Unity Application Block快速入门
http://www.cnblogs.com/zjypp/archive/2011/07/08/2319268.html
http://www.cnblogs.com/doriandeng/category/123100.html
主要內容:
1.Unity是什麽?
2.Unity能做什麽?
3.項目中什麽時候要使用到Unity?
2.快速入門
3.總結
一、Unity是什麽?
Unity是patterns & practices團隊開發的一個輕量級、可擴展的依賴注入字符串,具有如下的特性:
1.1它提供了創建(或者裝配)對象實例的機制,而這些對象實例可能還包含了其它被依賴的對象實例。
1.2Unity允許將預先配置的對象注入到類中,實現了控制反轉(IoC)的功能。在Unity中,支持構造器注入,屬性廟會注入以及方法注入。ps:這里的方法入與Martin Fowler定義的接口注入類似而稍有區別
1.3支持窗口的體系結構。一個容器可以有子容器,允許從子容器到父容器的對象定位查詢。
1.4可以通過配置文件進行準備和配置容器。
1.5不會影響到類的定義(屬性設值注入和方法注入除外),這也是輕量級容器的一個體現。
1.6支持自定義的窗口擴展。
二、Unity能做什麽?
2.1Unity支持簡單對象創建,特別是分層對象結構和依賴,以簡化程序代碼。其包含一個編譯那些可能存在依賴于其他對象的實例機制。
2.2Unity支持必要的抽象,其允許開發者在運行時或配置去指定依賴關係同時可以簡單的管理橫切點(AOP)。
2.3Unity增加了推遲到容器組件配置的靈活性。其同樣支持一個容器層次的結構。
2.4Unity擁有服務定位能力,對於一個程序在許多情況下重複使用組件來分享和集中功能是非常有用的。
2.5Unity允許客戶端儲存或緩存容器。對于在ASP.NET web applications中開發者將容器持久化于ASP.NET中的session或application中特別有效。
2.6Unity擁有攔截能力,其允許開發者通過創建并執行handlers(在方法或屬性被調用到達之前)來為已存在的組件增加一個函數,并再次為返回調用結果。
2.7Unity可以從標準配置系統中讀取配置信息,例如:XML文件,同時使用配置文件來配置容器。
2.8Unity支持開發者實現自定義窗口擴展,例如:你可以實現方法來額外的對象構造和容器特征,例如緩存。
2.9Unity允許架構師和開發者在現代化的程序中更簡單的實現通用設計模式。
三、項目中什麽時候要使用到Unity?
3.1所構建的系統依賴于健全的面向對象原則,但是大量不同的代碼交織在一起而難以維護。
3.2構建的對象和類需要依賴其他對象或類。
3.3依賴于複雜的需要抽象的對象。
3.4希望利用構造函數、方法或屬性的調用注入優勢。
3.5希望管理對象實例的生命週期。
3.6希望能夠在運行時管理并改變依賴關係。
3.7希望在攔截方法或属性调用的时候生成一个策略链或管道处理容器来实现横切(AOP)任务。
3.8希望在Web Application中的回發操作時能夠緩存或持久化依賴關係。
除了单独解决横切关注点如日志、认证、授权、缓存和异常处理的组件以外,现代业务系统通常由定制的业务对象和在应用程序中完成特殊的或者一般的任务的组件组成。
成功构建这样的应用程序的关键是获得解耦的或者极度松耦合的设计。松耦合的应用程序更加灵活、更加易于维护。同时在开发期间进行测试,可以模拟对象的桩(轻量级模拟的实现),这增强了实质的依赖。例如,数据库连接、网络连接、ERP 连接和富用户接口组件。
依赖注入是一种用于构建松耦合应用程序的主要技术。它提供了处理对象间依赖的方法。例如,一个处理用户信息的对象可能依赖于访问数据存储、验证信息和检查 用户是否被授权执行更新的其他对象。依赖注入技术可以确保用户类正确的初始化及组装所有这些对象,特别是依赖是抽象的地方。
使用容器可以有很多好处,但它会改变应用程序的设计方式,尤其适合于基于组件的开发,朋友们可以有选择的使用它。
三、快速入門
3.1 下载最新的是2.1版本,http://www.microsoft.com/download/en/details.aspx?id=17866
3.2 下载是msi文件,安装后有bin文件夹和源代码和几个实例项目
3.3 打开vs,新建项目,添加Microsoft.Practices.Unity.dll的引用,就可以使用依赖注入了
3.4準備接口和類
public interface ILogger
{
void Write(string message);
} public class DatabaseLogger:ILogger
{
#region ILogger 成員
public void Write(string message)
{
Console.WriteLine(String.Format("Message:{0}",message));
Console.WriteLine("Target:Database");
} #endregion
} public class FlatFileLogger:ILogger
{
#region ILogger 成員
public void Write(string message)
{
Console.WriteLine(String.Format("Message:{0}", message));
Console.WriteLine("Target:FlatFile");
}
#endregion
}
准备接口和类
3.5客戶端代碼
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, DatabaseLogger>();
ILogger logger = container.Resolve<ILogger>();
logger.Write("TerryLee");
Console.ReadLine();
客戶端代碼
3.6運行結果
依賴注入入門——Unity(二)的更多相关文章
- 依賴注入入門——Unity(一)
參考資料http://blog.csdn.net/m13666368773/article/details/7802126 背景介紹 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系, ...
- Delphi APP 開發入門(二)Android/iOS設定,Hello World
Delphi APP 開發入門(二)Android/iOS設定,Hello World 分享: Share on facebookShare on twitterShare on google_plu ...
- GOOGLE搜索從入門到精通V4.0
1,前言2,摘要3,如何使用本文4,Google簡介5,搜索入門6,初階搜索 6.1,搜索結果要求包含兩個及兩個以上關鍵字 6.2,搜索結果要求不包含某些特定資訊 6.3,搜索結果至少包含多個關鍵字中 ...
- Flask從入門到入土(三)——模板
模板是一個包含響應文本的文件,其中包含佔位變量表示的動態部分,其具體值只是請求上下文中才能知道.使用真實值替換變量,再返回最終得到的響應字符串,這一過程稱爲渲染.爲了渲染模板,Flask使用了一個名爲 ...
- Delphi APP 開發入門(四)簡易手電筒
Delphi APP 開發入門(四)簡易手電筒 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:32 ...
- Delphi APP 開發入門(五)GPS 定位功能
Delphi APP 開發入門(五)GPS 定位功能 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數 ...
- Delphi APP 開發入門(十)REST Client 開發
Delphi APP 開發入門(十)REST Client 開發 分享: Share on facebookShare on twitterShare on google_plusone_share ...
- Delphi APP 開發入門(九)拍照與分享
Delphi APP 開發入門(九)拍照與分享 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:30 ...
- Delphi APP 開發入門(八)SQLite資料庫
Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次 ...
随机推荐
- bzoj2732: [HNOI2012]射箭 半平面交
这题乍一看与半平面交并没有什么卵联系,然而每个靶子都可以转化为两个半平面. scanf("%lf%lf%lf",&x,&ymin,&ymax); 于是乎就有 ...
- JNI学习总结
JNI学习总结 标签(空格分隔): java JNI:Java Native Interface,是一种通过java调用本地方法的技术(当然也可以反过来),随着JDK版本的提升,JNI的效率也一直在提 ...
- Ubuntu下Java环境配置
Oracle Java安装: 通过以下命令进行安装: sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt ...
- ubuntu 下安装 apache php mysql
ubuntu 安装 apache+php+mysql1.打开终端,输入“sudo apt-get install apache2”,回车;(安装apache2.0或2.x新版本,系统会自动查找新的版本 ...
- PHP curl 采集内容之规则 1
<?phpheader("Content-type:text/html; charset=utf-8");$pattern = '/xxx(.*)yyyy/isU'; //i ...
- GitHub命令精简教程
Github其实也可以作为文件分享的地方,但是免费空间只有300M,所以不能存放大文件,否则可以成为一个分享资源的下载站,而且非常方便. 常用命令: git add . //添加所有的文件到索引 ...
- js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象
事件对象 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...
- PHP 易出问题记录
PHP foreach引用缺陷 <?php $array = array(1, 2, 3); foreach ($array as &$v) {} foreach ($array as ...
- Echart..js插件渲染报错 data.length<1?
问题 getJSON提交 返回数据正常,在传入参数进行序列化,渲染报表时报错 option.data.length < 1. 分析 1.可能情况一: . 可自己明明是getJSON()把渲染放 ...
- Django生产环境的部署-Apache-mod_wsgi
httpd.conf配置 ServerSignature On ServerTokens Full Define APACHE24 Apache2.4 Define SERVER_BASE_DIR & ...