在上篇文章《System.ComponentModel.Component入门》中,介绍了.NET本身的解决方案,既然.NET已经有了解决方案,为什么要自己实现呢?先看看使用.NET的方式写的代码:

1            using (IContainer container = new Container()) {
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>
    /// 注射依赖的服务组件。
    /// </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>();
    }

使用实例:

1    public class DataService : ServiceBase, IDataService {
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属性。

轻量容器和注射依赖 的自实现相关推荐

  1. Frappe Charts - 免费开源、轻量无依赖的 web 图表库,简单不臃肿,支持搭配 Vue / React 等框架使用

    一个小巧的图表库,基于 SVG 生成图表,使用很简单,推荐给大家. 关于 Frappe Charts Frappe Charts 是一个小巧简单的 JavaScript 图表库,通过简单几个参数,可以 ...

  2. K3s初探:Rancher架构师带你尝鲜史上最轻量Kubernetes发行版

    发布不到两天,GitHub上Star数已近3000,这个业界大热的.史上最轻量的开源Kubernetes发行版,你试过了没? Rancher资深架构师来教你走出尝鲜第一步!使用教程在此! 前 言 昨天 ...

  3. 在 C++ 中实现一个轻量的标记清除 gc 系统

    在 C++ 中实现一个轻量的标记清除 gc 系统 最近想把 engine 做一个简单 C++ 封装,结合 QT 使用.engine 本身是用纯 C 实现的,大部分应用基于 lua 开发.对对象生命期管 ...

  4. 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)

    周良伟 网易云信系统架构师 负责云信IM平台的架构设计和服务器研发团队 作者简介 今天和大家分享的主题是如何用Docker/Ansible来做轻量私有化的技术方案.首先,简单介绍一下所谓轻量私有化到底 ...

  5. 用轻量服务器搭建在线协作绘图白板

    WBO是一个自由和开源的在线协作白板.它允许多个用户同时在一个虚拟的大型白板上画图.该白板对所有线上用户实时更新,并且状态始终保持.它可以用于许多不同的目的,包括艺术.娱乐.设计和教学,使用起来也非常 ...

  6. 轻量型互联网应用架构方式

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者 | 天如 链接 | http://suo.im/4qRPkj 一.前言 说到互联网应用架构,就绕不开微服务,当下(2019)最热门的微 ...

  7. 用轻量服务器搭建自托管的视频会议服务,并集成到自己的项目中

    本文主要面向需要在自己系统中集成视频会议的读者. 客户要求在页面中集成视频会议功能,本来刚开始准备直接用腾讯云的服务来实现,但是客户说他们完全是一个不能访问互联网的局域网的环境,因此需要部署一个自托管 ...

  8. Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释

    首先我们要知道 Ioc是个啥? ​ IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 ...

  9. 31款轻量高效的开源 JavaScript 插件和库

    31款轻量高效的开源 JavaScript 插件和库 目前有很多网站设计师和开发者喜欢使用由[url=http://www.kubiji.cn/forum-id261.html]JavaScript[ ...

  10. TKE 注册节点,IDC 轻量云原生上云的最佳路径

    林顺利,腾讯云原生产品经理,负责分布式云产品迭代和注册节点客户扩展,专注于云原生混合云新形态的推广实践. 背景 企业在持续业务运维过程中,感受到腾讯云 TKE 带来的便捷性和极致的使用体验,将新业务的 ...

最新文章

  1. 机器学习视频第二章2
  2. python硬件测试开发_用python实现高性能测试工具(一)
  3. Flex 幻灯片播放
  4. 剑指offer之21-25题解
  5. mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...
  6. 微信APP支付(基于Java实现微信APP支付)
  7. 造芯片这事情,到底要不要找潘金莲算账?
  8. c++调用子进程捕获输出(windows,linux)
  9. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——第1章网络功能
  10. 练习--LINUX进程间通信之有名管理FIFO
  11. 京瓷1020怎么打印自检页_惠普打印机怎样打印测试页
  12. 本科毕设不通过是什么原因,哪个少年不曾为如何能够顺利优秀毕业而愁眉苦战
  13. 巧用CHKDSK命令修复U盘文件或目录损坏问题
  14. 需求分析——系统建模方法
  15. 3.字体样式,分隔线与段落
  16. 微信小程序发布视频带封面图标题
  17. 花最少钱购买阿里云服务器符合备案条件的云服务器配置
  18. 天龙八部元宝兑换代码
  19. 关于PHP工程师职业资格证书的了解
  20. OMA DRM V1.0学习笔记

热门文章

  1. 多个微服务的接口依赖如何测试_一文看懂微服务
  2. hadoop配置文件还原_hadoop通过Configuration对象自定义配置文件
  3. axios直传阿里云,获取上传进度已以及取消上传
  4. Ubuntu18.04安装MyEclipse2017 CI 10
  5. 使用 data URI scheme 在网页中内嵌图片[转]
  6. 部分关键字--this/extends/super/static/final/abstract/访问权限总结
  7. when-to-use-rebuild-vs-coalesce-vs-shrink
  8. Google GPS在Android上的一些应用
  9. 发送带嵌入图片邮件之SMTP实现和ESMTP实现
  10. 什么是PM2 ---- (零秒重启)