轻量容器和注射依赖 的自实现
2 IOrderService orderService = GetService(typeof(IOrderService)) as IOrderService;
3 container.Add(orderService);
4 }
1、通过GetService获取的组件,无法自动加入新的容器;
在.NET中,GetService方法是由Site定义的(实际实现是容器实现的),且不包含加入新容器的参数,所以新创建的组件只能笨拙的加入容器(第3行)。
2、商业组件内部代码耦合了Container实现;
在第1行,只能自己实例化一个容器,不管是耦合Container还是耦合自己的容器,都是违反了注射依赖的初衷。
3、难以理解
正如上一篇文章中的回复所说的,“我还是不懂”,是的,.NET的站点和容器的设计的确让人难以理解。
基于上面的问题,我设计了一个新的接口定义:
/// 注射依赖的服务组件。
/// </summary>
public interface IService {
/**//// <summary>
/// 返回/设置当前服务组件的上下文。
/// </summary>
/// <remarks>
/// 不需要服务自己处理此属性,组件在初始化后,将有上层服务自动初始化。
/// 请参见:<see cref="IServiceContainer.GetService<T>"/>
/// </remarks>
IServiceContext Context { get;set;}
}
/**//// <summary>
/// 服务的上下文,通过他,可以获取新的容器。
/// </summary>
public interface IServiceContext {
IServiceContainer CreateContainer();
}
/**//// <summary>
/// 容器对象,通过他创建的服务将自动初始化 Context属性,并在容器释放后自动释放。
/// </summary>
public interface IServiceContainer : IServiceFactory, IDisposable { }
/**//// <summary>
/// 服务工厂接口
/// </summary>
public interface IServiceFactory {
T GetService<T>();
}
使用实例:
2
3 public void UpdateDB() {
4 using (IServiceContainer container = Context.CreateContainer()) {
5 ILogService log = container.GetService<ILogService>();
6 log.WriteLog();
7 }
8 }
9 }
1、在类的定义中,继承自ServiceBase,他是IService的基础实现,当然你可以自己实现IService,实现非常简单;
2、当你需要使用别的服务时,通过Context创建新的容器,并在新的容器中创建服务,这样新的服务就自动加入新的容器,并自动初始化了Context属性。
轻量容器和注射依赖 的自实现相关推荐
- Frappe Charts - 免费开源、轻量无依赖的 web 图表库,简单不臃肿,支持搭配 Vue / React 等框架使用
一个小巧的图表库,基于 SVG 生成图表,使用很简单,推荐给大家. 关于 Frappe Charts Frappe Charts 是一个小巧简单的 JavaScript 图表库,通过简单几个参数,可以 ...
- K3s初探:Rancher架构师带你尝鲜史上最轻量Kubernetes发行版
发布不到两天,GitHub上Star数已近3000,这个业界大热的.史上最轻量的开源Kubernetes发行版,你试过了没? Rancher资深架构师来教你走出尝鲜第一步!使用教程在此! 前 言 昨天 ...
- 在 C++ 中实现一个轻量的标记清除 gc 系统
在 C++ 中实现一个轻量的标记清除 gc 系统 最近想把 engine 做一个简单 C++ 封装,结合 QT 使用.engine 本身是用纯 C 实现的,大部分应用基于 lua 开发.对对象生命期管 ...
- 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)
周良伟 网易云信系统架构师 负责云信IM平台的架构设计和服务器研发团队 作者简介 今天和大家分享的主题是如何用Docker/Ansible来做轻量私有化的技术方案.首先,简单介绍一下所谓轻量私有化到底 ...
- 用轻量服务器搭建在线协作绘图白板
WBO是一个自由和开源的在线协作白板.它允许多个用户同时在一个虚拟的大型白板上画图.该白板对所有线上用户实时更新,并且状态始终保持.它可以用于许多不同的目的,包括艺术.娱乐.设计和教学,使用起来也非常 ...
- 轻量型互联网应用架构方式
点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者 | 天如 链接 | http://suo.im/4qRPkj 一.前言 说到互联网应用架构,就绕不开微服务,当下(2019)最热门的微 ...
- 用轻量服务器搭建自托管的视频会议服务,并集成到自己的项目中
本文主要面向需要在自己系统中集成视频会议的读者. 客户要求在页面中集成视频会议功能,本来刚开始准备直接用腾讯云的服务来实现,但是客户说他们完全是一个不能访问互联网的局域网的环境,因此需要部署一个自托管 ...
- Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释
首先我们要知道 Ioc是个啥? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 ...
- 31款轻量高效的开源 JavaScript 插件和库
31款轻量高效的开源 JavaScript 插件和库 目前有很多网站设计师和开发者喜欢使用由[url=http://www.kubiji.cn/forum-id261.html]JavaScript[ ...
- TKE 注册节点,IDC 轻量云原生上云的最佳路径
林顺利,腾讯云原生产品经理,负责分布式云产品迭代和注册节点客户扩展,专注于云原生混合云新形态的推广实践. 背景 企业在持续业务运维过程中,感受到腾讯云 TKE 带来的便捷性和极致的使用体验,将新业务的 ...
最新文章
- 机器学习视频第二章2
- python硬件测试开发_用python实现高性能测试工具(一)
- Flex 幻灯片播放
- 剑指offer之21-25题解
- mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...
- 微信APP支付(基于Java实现微信APP支付)
- 造芯片这事情,到底要不要找潘金莲算账?
- c++调用子进程捕获输出(windows,linux)
- 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——第1章网络功能
- 练习--LINUX进程间通信之有名管理FIFO
- 京瓷1020怎么打印自检页_惠普打印机怎样打印测试页
- 本科毕设不通过是什么原因,哪个少年不曾为如何能够顺利优秀毕业而愁眉苦战
- 巧用CHKDSK命令修复U盘文件或目录损坏问题
- 需求分析——系统建模方法
- 3.字体样式,分隔线与段落
- 微信小程序发布视频带封面图标题
- 花最少钱购买阿里云服务器符合备案条件的云服务器配置
- 天龙八部元宝兑换代码
- 关于PHP工程师职业资格证书的了解
- OMA DRM V1.0学习笔记
热门文章
- 多个微服务的接口依赖如何测试_一文看懂微服务
- hadoop配置文件还原_hadoop通过Configuration对象自定义配置文件
- axios直传阿里云,获取上传进度已以及取消上传
- Ubuntu18.04安装MyEclipse2017 CI 10
- 使用 data URI scheme 在网页中内嵌图片[转]
- 部分关键字--this/extends/super/static/final/abstract/访问权限总结
- when-to-use-rebuild-vs-coalesce-vs-shrink
- Google GPS在Android上的一些应用
- 发送带嵌入图片邮件之SMTP实现和ESMTP实现
- 什么是PM2 ---- (零秒重启)