依賴注入入門——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 閲讀次 ...
随机推荐
- 九度OJ 1468 Sharing -- 哈希
题目地址:http://ac.jobdu.com/problem.php?pid=1468 题目描述: To store English words, one method is to use lin ...
- EIGamal密码体制
EIGamal密码体制:由EIGamal提出,是一种基于离散对数问题的双钥密码体制,既可用于加密,又可以用于签名. 密钥对生成步骤: 1.取大素数p和g<p(g最好是p的素根) 2.选一整数x& ...
- Github进行项目管理的常用命令总结
最近项目中使用github来管理代码,将git的常用命令整理了一下,方便以后查询 查看git的本地配置git config --list 克隆到本地git clone (网页上面的那个http地址 g ...
- 疯狂学习java web
因工作需要,疯狂学习java web,只是这么多年一直从事C++开发,突然之间要接手同事的那么一大堆代码,真有无从下手的感觉,首先是要学习html,然后是js, 然后是jsp,当然还有各种框架,想想就 ...
- IBUS-WARNING **: Process Key Event failed: Timeout was reached
在gvim中ibus敲字时,偶尔会在n秒之后才显示到屏幕,反应死慢.控制台会看到下面的错误信息. (gvim:): IBUS-WARNING **: Process Key Event failed: ...
- 判断JS对象是否拥有某属性的方法举例
判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...
- jquery 中的 $("#id") 与 document.getElementById("id") 的区别
以前没注意过,认为jquery 中的 $("#air") 与 document.getElementById("air") 是一回事,指的是同一个东西.在今天写 ...
- PHP curl 采集内容之规则 1
<?phpheader("Content-type:text/html; charset=utf-8");$pattern = '/xxx(.*)yyyy/isU'; //i ...
- App页面显示优化
在开发移动端APP页面时,对各操作系统各种型号的手机进行适配是必须的.然鹅,上周在开发完一个落地页后,被测试给打了回来,其中列出了一个在我看来很小的问题:单击进入页面的时候,页面还没加载完的时候字体显 ...
- jquery点击图片选中特效
jquery点击图片选中特效 点击在线预览效果