前言:在平时的写代码中为了解耦、方便扩展,经常使用一些DI容器(如:Autofac、Unity),那是特别的好用。

关于它的底层实现代码 大概是这样。

一、使用依赖注入的好处

  关于使用依赖注入创建对象的好处网上一找就是一大堆(低耦合、可配置等),这里就不复制粘贴了。

二、使用XML+Assembly实现可配置的Container

namespace com.cqgc.TestSys.Core
{
public class Container
{
private static Container instance;//实例
private static XDocument xml;//UI层的服务实现配置文件实例 public static Container Instance//全局IOC窗口实例,单例模式
{
get
{
if (instance == null)
{
instance = new Container();
}
if (xml == null)
{
//读取UI层的服务实现配置文件
xml = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "/Configuration/Service.xml");
}
return instance;
}
} /// <summary>
/// 向外提供创建对象的方法
/// </summary>
/// <typeparam name="T">Service</typeparam>
/// <returns></returns>
public T Resolve<T>()
where T : class
{
return GetComponentInstance<T>(typeof(T).Name);
} /// <summary>
/// 通过XMl中的Service名创建对应的业务逻辑实体
/// </summary>
/// <typeparam name="T">Component</typeparam>
/// <param name="service">Service名字</param>
/// <returns>Component</returns>
public T GetComponentInstance<T>(string service)
where T : class
{
//没找到配置文件
if (xml == null)
{
throw new ArgumentNullException("没找到配置文件"+ nameof(xml));
}
//在UI层的服务实现配置文件根据接口文件名读取实现接口文件的业务逻辑实体
var element = (from p in xml.Root.Elements("element")
where p.Attribute("Id").Value.Equals(service)
select new
{
serviceNamespace = p.Attribute("Service").Value,
classNamespace = p.Attribute("Class").Value
}).FirstOrDefault(); //没找到配置节点
if (string.IsNullOrEmpty(element.classNamespace))
{
throw new Exception("配置文件结点" + service + "出错!");
}
string[] configs = element.classNamespace.Split(','); //XML配置中接口和业务逻辑实体不成对
if (configs.Length != )
{
throw new Exception("配置文件结点" + service + "出错!");
} ProxyGenerator generator = new ProxyGenerator();//代码生成器
T t = (T)Assembly.Load(configs[]).CreateInstance(configs[]);//根据配置文件实例化一个对象 return t;
} //释放资源
public void Dispose()
{
instance = null;
xml = null;
}
}
}

三、XML

<?xml version="1.0" encoding="utf-8" ?>
<root>
<element Id="IUserService" Service="com.cqgc.TestSys.Service.IUserService, com.cqgc.TestSys.Service" Class="com.cqgc.TestSys.Component.UserComponent, com.cqgc.TestSys.Component"></element>
<element Id="ISysUserService" Service="com.cqgc.TestSys.Service.ISysUserService, com.cqgc.TestSys.Service" Class="com.cqgc.TestSys.Component.SysUserComponent, com.cqgc.TestSys.Component"></element>
</root>

四、调用

var _user=Container.Instance.Resolve<ISysUserService>();

自己写一个依赖注入容器Container的更多相关文章

  1. YII框架的依赖注入容器

    依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象. 所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能.那么这个对象就 ...

  2. PHP程序员如何理解依赖注入容器(dependency injection container)

    背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim ...

  3. Yii2.0 依赖注入(DI)和依赖注入容器的原理

    依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...

  4. yii2之依赖注入与依赖注入容器

    一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...

  5. yii依赖注入和依赖注入容器

    依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...

  6. php的依赖注入容器

    这里接着上一篇 php依赖注入,直接贴出完整代码如下: <?php class C { public function doSomething() { echo __METHOD__, '我是C ...

  7. IoC 依赖注入容器 Unity

    原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...

  8. Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它

    Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...

  9. WPF PRISM开发入门二(Unity依赖注入容器使用)

    这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...

随机推荐

  1. 小程序生成海报:通过 json 配置方式轻松制作一张海报图

    背景 由于我们无法将小程序直接分享到朋友圈,但分享到朋友圈的需求又很多,业界目前的做法是利用小程序的 Canvas 功能生成一张带有二维码的图片,然后引导用户下载图片到本地后再分享到朋友圈.而小程序 ...

  2. 一次Spring Transactional嵌套事务使用不同的rollbackFor的分析

    起因: 项目期间由于一次异常回滚问题,发现自己在事务知识方面知识的遗漏,趁着这次机会,做了几次rollbackFor的测试. 测试:   现在有两个事务,事务oute包含事务Inner.事务A回滚规则 ...

  3. NX二次开发-UFUN将工程图中的点坐标映射到建模绝对坐标UF_VIEW_map_drawing_to_model

    #include <uf.h> #include <uf_ui.h> #include <uf_draw.h> #include <uf_view.h> ...

  4. NX二次开发-算法篇-判断找到两个数组里不相同的对象

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  5. CF1265B Beautiful Numbers

    题意 给一个长度为\(n\)的排列\(P\),求对于\(1\) 到 \(n\)中的每个数\(m\),是否能找到一段长度为\(m\)的区间使得区间内的数是一个\(1\)到\(m\)的排列. 输出一个\( ...

  6. HDU5669

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  给你n个点 ...

  7. Delphi常用字符串函数

    Delphi常用字符串函数   一.字符转换函数1.ord(input[i])返回字符表达式 input 左端起第 I 字符的ASCII 码值.2.CHAR()将ASCII 码转换为字符.如果没有输入 ...

  8. 2. Vim 概念扫盲

    Frm: http://www.linuxidc.com/Linux/2013-05/84031p2.htm 了解Vim的三个基本模式 当我们安装完一个编辑器后,肯定会打开它,然后在里面输入点什么东西 ...

  9. unittest(2)

    测试用例执行顺序 1.setUp和tearDown相关 setUp:表示前置条件,它在每一个用例执行之前必须会执行一次        setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对 ...

  10. jmeter接口测试(基础)

    一.jmeter创建请求 1.运行jmeter:jmeter.bat 2.右键测试计划,添加一个:线程组 3.右键前面添加的线程组,添加一个:http请求 4.填写请求信息:     5.右键线程组, ...