前言:在平时的写代码中为了解耦、方便扩展,经常使用一些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. OpenGL ANYTOOL

    { https://github.com/zhmmmm/ANYTOOL-2.0.0.0.2Version }

  2. Python:Logging日志处理

    程序中,需要添加日志来记录大量信息. import logging # 第一步:创建logger self.logger = logging.getLogger() self.logger.setLe ...

  3. 通过jquery获取页面信息

    获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document ...

  4. javafx教程大全

    链接: https://www.yiibai.com/javafx

  5. NX二次开发-UFUN打开二进制STL文件函数UF_STD_open_binary_stl_file

    NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...

  6. JavaScript闭包和回调详解

    一.闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包有三个特性: 1.函数嵌套函数; 2.函数内部可以引用外部的参数和变量; 3.参 ...

  7. 扩展BSGS-传送门

    很好的讲解:ZigZagK 好的讲解:mjtcn 某个模板:here 模板题: BSGS:ZigZagK的poj2417 exBSGS:ZigZagK的poj3243 — AC_Gibson 一般的板 ...

  8. Centos6.5安装ruby2.2.3

    一.安装库 Yum install –y gcc* openssl* wget 二.安装ruby wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby- ...

  9. AtCoder ABC 128F Frog Jump

    题目链接:https://atcoder.jp/contests/abc128/tasks/abc128_f 题目大意 给定长度为 N 的序列$s_0, s_1, \dots, s_{N-1}$,现在 ...

  10. mysql key分区,分区数制定

    我相信不 太注意的同学肯定会入坑,今天我差点也入坑了,后面自己问自己如果我用key分区,自己问自己 我的分区数应该是多少??? 后面我陷入了沉思......... 我第一次想先随便弄一个分区数,在本地 ...