[書訊]《.NET 依賴注入》 (2014-12-08 更新)
书 名:.NET 依赖注入
页 数:235
格 式:PDF、EPUB、MOBI
难易度:中阶至进阶
出版日期:2014 年 12 月 8 日
ISBN:9789574320684
简介
本书内容是关于 .NET 相依性注入(dependency injection;简称 DI)的相关议题。透过本书,您将会了解:
- 什么是 DI、它有什么优点、何时使用 DI、以及可能碰到的陷阱。
- 如何运用 DI 应付容易变动的软体需求,设计出更弹性、更好维护的程式码。
- 与 DI 有关的设计模式。
- DI 于.NET 应用程序中的实务应用(如 ASP.NET MVC、ASP.NET WEB API、WCF 等等)。
- 如何在应用程序中使用现成的 DI 框架来协助实现 DI。本书支持的 DI 框架主要是
Unity,部分章节有提供 Autofac 的范例(如第 5 章、第 6 章)。
本书的范例皆以 C# 撰写,读者无须具备任何 DI 背景知识。
【点我下载样章】
如何购买
您可以至下列平台购买(都有样章可以免费下载试阅):
- Leanpub: https://leanpub.com/dinet-s (建议採用! 先注册一个使用者账号,然后利用此账号来买书)
请注意:注册账号时填写的 e-mail 必须是有效的!这很重要,因为往后的书籍更新通知讯息都会发送到这个 e-mail 地址。 - Pubu:http://goo.gl/orzQRJ (中文用戶介面,support both online reading and download PDF/EPUB)
- SelfStore:https://selfstore.io/products/247 (功能比較阳春,好處是中文用戶介面)
购书时,您可在网页上自行调整价格滑动杆,以本书的最低价格结账。当然,如果您要给予作者更多鼓励,也可以直接用建议售价或更高的价钱来购买。
更新通知
订购此书时,只要有输入 e-mail 地址,将来有新版本发布时,您就会收到更新通知和下载连结。
Table of Content
序
关于本书
谁适合阅读本书
如何阅读本书
书写惯例
需要准备的工具
更新与支持
范例程序与补充材料
致谢
Part I:基础篇
第 1 章:导论
为什么需要 DI?
可维护性
宽松耦合
可测试性
平行开发
什么是 DI?
入门范例—非 DI 版本
入门范例—DI 版本
提炼接口(Extract Interface)
控制反转(IoC)
何时该用 DI?
本章回顾
第 2 章:DI 用法与模式
设计模式梗概
小引-电器与接口
Null Object 模式
Decorator 模式
Composite 模式
Adapter 模式
Factory 模式
注入方式
构造函数注入
已知应用例
用法
范例程序
属性注入
已知应用例
用法
范例程序
方法注入
已知应用例
用法
范例
Ambient Context 模式
已知应用例
范例程序(一)
范例程序(二)
Service Locator 模式
过犹不及-再谈构造函数注入
半吊子注入
阻止相依蔓延
解决「半吊子注入」
过度注入
重构成参数对象
重载构造函数
重构成 Façade 模式
本章回顾
第 3 章:DI 容器
DI 容器简介
对象组合
自制 DI 容器
自制 DI 容器—2.0 版
现成的 DI 容器
对象组合
使用 XML
使用代码
自动注册
自动匹配
深层解析
对象生命周期管理
内存泄漏问题
生命周期选项
拦截
使用 Decorator 模式实现拦截
本章回顾
Part II:实战篇
第 4 章:DI 与 ASP.NET MVC 分层架构
分层架构概述
Repository 模式
MVC 分层架构范例 V1-紧密耦合
领域模型
数据访问层
应用层
表示层
检视目前设计
MVC 分层架构范例 V2-宽松耦合
领域模型
数据访问层
应用层
表示层
组合对象
切换 Controller 工厂
检视目前设计
避免过度设计
MVC 分层架构范例 V3-简化一些
数据访问层
应用层
表示层
检视目前设计
一个 HTTP 请求搭配一个 DbContext
ASP.NET MVC 5 的 IDependencyResolver
实现自定义的 IDependencyResolver 组件
本章回顾
第 5 章:DI 与 ASP.NET Web API
ASP.NET Web API 管线
Controller 是怎样建成的?
注入对象至 Web API Controller
抽换 IHttpControllerActivator 服务
纯手工打造
使用 DI 容器:Unity
抽换 IDependencyResolver 服务
IDependencyResolver 与 IDependencyScope
纯手工 DI 范例
步骤 1:实现 IDependencyResolver 接口
步骤 2:替换默认的类型解析器
使用 DI 容器:Unity
使用 DI 容器:Autofac
本章回顾
第 6 章:更多 DI 实现范例
共享代码
DI 与 ASP.NET MVC 5
练习:使用 Unity
Step 1:建立新项目
Step 2:设定 Unity 容器
Step 3:建立 Controller
DI 与 ASP.NET Web Forms
问题描述
解法
练习:使用 Unity
Step 1:建立新项目
Step 2:注册类型
Step 3:编写 HTTP Handler
Step 4:注册 HTTP Handler
Step 5:编写测试页面
练习:使用 Unity 的 BuildUp 方法
练习:使用 Autofac
Step 1:建立新项目
Step 2:注册类型
Step 3:编写 HTTP Handler
Step 4:注册 HTTP Handler
Step 5:编写测试页面
DI 与 WCF
问题描述
解法
练习:使用 Unity
Step 1:建立 WCF 服务
Step 2:编写自定义的 ServiceHostFactory
Step 3:编写自定义的 ServiceHost
Step 4:实现 IContractBehavior 接口
Step 5:实现 IInstanceProvider 接口
Step 6:设定 Unity 容器
Step 7:修改 Web.config
Step 8:编写客户端程序
练习:使用 Autofac.Wcf 套件
Step 1:建立 WCF 服务
Step 2:编写自定义的 ServiceHostFactory
Step 3:设定 Autofac 容器
Step 4:修改 Web.config
Step 5:编写客户端程序
本章回顾
Part III:工具篇
第 7 章:Unity 学习手册
Unity 快速入门
Hello, Unity!
注册类型对应
注册现有对象
解析
解析一个对象:Resolve
具名注册与解析
解析多个对象:ResolveAll
注册与解析泛型
检查注册
使用配置文件来设定容器
Unity 配置文件基本格式
加载配置文件设定
注册与解析-进阶篇
共享的范例程序
情境
设计
代码
自动注册
解决重复类型对应的问题
AllClasses 类型
WithMappings 类型
自动匹配
自动匹配规则
手动匹配
循环参考问题
注入参数
注入属性
延迟解析
使用 Lazy
使用自动工厂
注入自定义工厂
对象生命周期管理
默认的生命周期
指定生命周期
Transient vs. Per-Resolve
Per-Request 生命周期
阶层式容器
选择生命周期管理员
拦截
使用 Unity 容器实现拦截
Step 1:加入 Unity 的拦截扩展包
Step 2:实现拦截行为
Step 3:注册拦截行为
结语
附录一:DI 容器实务建议
容器设定
避免对同一个组件(DLL)重复扫描两次或更多次
使用不同类型来注册不同用途的组件
使用非静态类型来建立与设定 DI 容器
不要另外建立一个 DLL 项目来集中处理依赖关系的解析
为个别组件加入一个初始化类型来设定依赖关系
扫描组件时,尽量避免指定组件名称
生命周期管理
优先使用 DI 容器来管理对象的生命周期
考虑使用子容器来管理 Per-Request 类型的对象
在适当时机调用容器的 Dispose 方法
组件设计相关建议
避免建立深层的巢状对象
考虑使用泛型来封装抽象概念
考虑使用 Adapter 或 Façade 来封装 3rd-party 组件
不要一律为每个组件定义一个接口
对于同一层(layer)的组件,可依赖其具象类型
动态解析
尽量避免把 DI 容器直接当成 Service Locator 来使用
考虑使用对象工厂或 Func 来处理晚期绑定
附录二:初探 ASP.NET 5 的自带 DI 容器
练习步骤
步骤 1:建立项目
步骤 2:加入必要组件
步骤 3:将 Web API 组件加入 ASP.NET 管线
步骤 4:加入 API Controller
步骤 5:编写测试用的服务类型
步骤 6:注入相依对象至 Controller 的构造函数
结语
下载范例程式与补充资料
本书的完整范例程式与相关补充资料都放在 github 网站上。网址如下:
https://github.com/huanlin/di-book-support
意见反馈
如有任何疑问或建议,欢迎在此留言指教,或与作者本人联系。谢谢~
[書訊]《.NET 依賴注入》 (2014-12-08 更新)的更多相关文章
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- app后端设计(11)-- 系统架构(2014.12.05更新)
个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...
- app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)
在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...
- Android应用开发相关下载资源(2014/12/14更新)
官方终于发布了Android Studio正式版,Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK (Android SDK主安装包,包含SDK ...
- 大型网站演化(转载 http://homeway.me/2014/12/10/think-about-distributed-clusters/)
0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Clu ...
- LAMP开发之环境搭建(2014.12.7在ubuntu下)
Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache ...
- 依賴注入入門——Unity(一)
參考資料http://blog.csdn.net/m13666368773/article/details/7802126 背景介紹 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系, ...
- 依賴注入入門——Unity(二)
參考博客文章http://www.cnblogs.com/kebixisimba/category/130432.html http://www.cnblogs.com/qqlin/tag/Unity ...
- [MVC学习日记]2014/12/01 初步认识MVC模型。
2014/12/011.初步认识MVC模型.MVC模式是一种表现模式.它将web应用程序分成三个部分,模型(Model).视图(View).控制器(Controller).Model:是实现业务逻辑层 ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
随机推荐
- 【codeforces 791B】Bear and Friendship Condition
[题目链接]:http://codeforces.com/contest/791/problem/B [题意] 给你m对朋友关系; 如果x-y是朋友,y-z是朋友 要求x-z也是朋友. 问你所给的图是 ...
- 手动安装配置Android Studio
官网下载Android Studio安装包后安装启动Android Studio,程序提示安装SDK,因为代理/FQ的原因,安装component失败,错误如下: Preparing "In ...
- Android中间httpclient发送帧get求
/** * 採用httpclientGet请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到 ...
- QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)
QT之二级菜单 QT之二级菜单 开场白 效果图 上代码 可参考文章 下代码 结尾 开场白 今天我们一起来了解下,在我们QT中,二级菜单是如何实现的,在上篇我们学习了QT之系统托盘,QT之自定义菜单, ...
- MacOS系统升级后,IDEA的SVN不好用的问题
最近给MacOS升级到10.13.2(High Sierra). 结果,发现IDEA的SVN不好用了. 提示如下: 查看IDEA的Subversion设置应该是这个样子的: 但是,设置后没有效 ...
- python 强制类型转换 以及 try expect
强制类型转换: 字符串 --> 整型: 字符串 第一个 是 + 或者 - ,会直接去掉 符号 ,返回 数字 如: a = '+123456' s = int(a) print(s) s ...
- 简明Python3教程 15.异常
简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢 ...
- WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果
原文:WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果 本以为Label也有TextChanged 事件,但在使 ...
- otrs离线部署
OTRS5离线部署 参考地址:https://doc.otrs.org.cn/doc/manual/admin/stable/zh_CN/html/manual-installation-of-otr ...
- WPF 属性变更通知类的实现
原文:WPF 属性变更通知类的实现 平时用依赖属性多一些,普通属性的变更通知知道有这个方法,但是老是忘记名字,再写一遍吧. public class Student : INotifyProperty ...