自己写一个依赖注入容器Container
前言:在平时的写代码中为了解耦、方便扩展,经常使用一些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的更多相关文章
- YII框架的依赖注入容器
依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象. 所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能.那么这个对象就 ...
- PHP程序员如何理解依赖注入容器(dependency injection container)
背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- yii2之依赖注入与依赖注入容器
一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...
- yii依赖注入和依赖注入容器
依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...
- php的依赖注入容器
这里接着上一篇 php依赖注入,直接贴出完整代码如下: <?php class C { public function doSomething() { echo __METHOD__, '我是C ...
- IoC 依赖注入容器 Unity
原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...
- Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它
Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...
- WPF PRISM开发入门二(Unity依赖注入容器使用)
这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...
随机推荐
- 线程池 一 ScheduledThreadPoolExecutor
java.util.concurrent public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ...
- JavaWeb学习篇之----Session&&Cookie
今天继续来看看JavaWeb的相关知识,这篇文章主要来讲一下Session和Cookie的相关知识,首先我们来看一下Cookie的相关知识: 一.Cookie 简介: Cookie是客户端技术,服务器 ...
- 线性dp——cf988F
不是很难,dp[i]表示到位置i的最小花费 #include<bits/stdc++.h> using namespace std; #define ll long long #defin ...
- delphi根据不同图片生成不规则窗口的实现(仅限于BMP格式)
unit CreateImageForm; interface uses Windows, SysUtils, Variants, Classes, Graphics; procedure Creat ...
- NX二次开发-UFUN关闭STL文件函数UF_STD_close_stl_file
NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...
- java-day12
数据结构 常用的数据存储结构:栈,队列,数组,列表,红黑树. 栈:先进后出(入口和出口在用一侧) 队列:先进先出 数组: 查询快:因为数组的地址是连续的,通过数组的首地址找到数组中的元素. 增/删慢: ...
- shell 基本系统命令,关机重启,查看版本,查手册,日期,磁盘,历史命令
1. 查看系统版本及内核版本 cat /etc/issue 查看系统版本 uname -r 查看内核版本 2. 关机重启命令 关机: shutdown -h now 立即关机 shut ...
- postman报InvalidArgumentException
解决方案:
- CF538G Berserk Robot
题意:一个机器人在一个无穷大的网格图中,每秒能够上下左右走一步.它的行走方向序列是长度为l的循环.给你n个线索,包括ti:时间,xi,yi走到的坐标.让你构造出行走的方向序列? 标程: #includ ...
- wpf datagrid 如何自定义行的控件实例,(textbox 并选中则全选)
主要是为了用户输入方便 按回车,选中下一列,text自动获取焦点,输入状态 获取控件实例 https://blog.csdn.net/m15188153014/article/details/486 ...