Demo中的IOC自定义实现

在做练习的时候,小小项目,使用IOC控件觉得麻烦,使用工厂觉得不高大上啊,自己写个简陋的依赖注入IOC吧;

控制反转(IOC)是管理映射依赖的的,是依赖倒置(DIP)的实现方式;

依赖倒置(DIP)是设计原则,控制反转(IOC)是具体实现,依赖注入(DI)是控制反转的具体实现;

解决方案的目录:

IOC
有3个类,一个是用来保存依赖关系的实体类(EntityIOC),一个是保存依赖关系的类(InterviewsDependencyResolver),一个是外部调用类(InterviewsIOC);

我理解的核心就是依赖关系.使用反射实现依赖倒置.

EntityIOC 代码:

/// <summary>
/// 依赖注入实体
/// </summary>
internal class EntityIoc
{
private EntityIoc(){ }
public EntityIoc(string _namespace, string _fullName)
{
Namespace = _namespace;
FullName = _fullName;
}
/// <summary>
/// 程序集名称
/// </summary>
public string Namespace { get; set; }
/// <summary>
/// 实例名(不包括命名空间)
/// </summary>
public string FullName { get; set; }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

InterviewsDependencyResolver 代码:

 /// <summary>
///容器
/// </summary>
internal class InterviewsDependencyResolver<IEntity> where IEntity : class
{
private InterviewsDependencyResolver() { }

private static Dictionary<EntityIoc, EntityIoc> _dictIoc = new Dictionary<EntityIoc, EntityIoc>();

//private static Dictionary<Type, Type> accessDict = new Dictionary<Type, Type>();
public static EntityIoc Get()
{
Type ientity = typeof(IEntity);
//需要返回的值
EntityIoc iioc = new EntityIoc(ientity.Module.Name.Replace(".dll", ""), ientity.FullName);
//集合中的数据
iioc = _dictIoc.Keys.Where(a => a.FullName == iioc.FullName && a.Namespace == iioc.Namespace).FirstOrDefault();
if (iioc != null)
{
//根据Key返回集合中保存的实例信息
return _dictIoc[iioc];
}
return null;
}

/// <summary>
/// 绑定
/// </summary>
/// <typeparam name="T"></typeparam>
public static void To<T>() where T : class
{
Type ientity = typeof(IEntity);
Type entity = typeof(T);
EntityIoc iioc = new EntityIoc(ientity.Module.Name.Replace(".dll", ""), ientity.FullName);
EntityIoc ioc = new EntityIoc(entity.Module.Name.Replace(".dll", ""), entity.FullName);
if (!_dictIoc.Keys.Contains(iioc))
{
_dictIoc.Add(iioc, ioc);
}
}
/// <summary>
/// 取消绑定
/// </summary>
/// <typeparam name="T"></typeparam>
public static void UninstallTo<T>() where T : class
{
Type ientity = typeof(IEntity);
EntityIoc iioc = new EntityIoc(ientity.Module.Name.Replace(".dll", ""), ientity.FullName);
//集合中的数据
iioc = _dictIoc.Keys.Where(a => a.FullName == iioc.FullName && a.Namespace == iioc.Namespace).FirstOrDefault();
if (iioc != null)
{
_dictIoc.Remove(iioc);
}
}

}


InterviewsIOC 代码:

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

/// <summary>
/// 简单IOC
/// </summary>
public class InterviewsIOC
{
private InterviewsIOC() { }
/// <summary>
/// 绑定
/// </summary>
public static void Bing()
{
//配置文件读取或者直接绑定,如果是配置文件读取,需要先读取后反射为类(用来判断依赖是否正确)
InterviewsDependencyResolver<IAccountService>.To<Impl.AccountService>();
}
/// <summary>
/// 获取依赖中具体实现
/// </summary>
/// <typeparam name="IEntity"></typeparam>
/// <returns></returns>
public static IEntity LoadInstance<IEntity>() where IEntity : class
{
IEntity resultEntity = null;
EntityIoc ioc = InterviewsDependencyResolver<IEntity>.Get();
if (ioc != null)
{
try
{
//反射实现接口实例
resultEntity = (IEntity)Assembly.Load(ioc.Namespace).CreateInstance(ioc.FullName);
}
catch (Exception ex)
{

throw;
}

}
return resultEntity;
}

}

 
程序使用:
 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Demo中的IOC自定义实现

时间: 2024-10-16 00:39:53

Demo中的IOC自定义实现的相关文章

Android中如何做到自定义的广播只能有指定的app接收

今天没吊事,又去面试了,具体哪家公司就不说了,因为我在之前的blog中注明了那些家公司的名字,结果人家给我私信说我泄露他们的题目,好吧,我错了...其实当我们已经在工作的时候,我们可以在空闲的时间去面一面,因为面试有很多好处的: 第一点:你知道这个公司的具体地址了,以后和朋友说的时候也是有话题的 第二点:这点很重要,看看其他公司的面试题(现在有的公司还在采用笔试题这个环节,真心无语了,题目全是从网上找的,很没有意思,所以我只要见到有笔试题的一律pass,个人感觉面到现在,阿里和滴滴还是不错的,他

理解Spring中的IoC和DI

什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方"实现具有依赖关系的对象之间的解耦. DI(Dependence Injection 依赖注入):将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables). 控制反转是一种思想 依赖注入是一种设计模式 I

【持续集成】[Jenkins]Job中如何传递自定义变量

[Jenkins]Job中如何传递自定义变量 来自dweiwei   2015-06-27 18:37:19|  分类: 自动化测试 |举报 |字号大中小 订阅 用微信  “扫一扫” 将文章分享到朋友圈. 用易信  “扫一扫” 将文章分享到朋友圈. 下载LOFTER 我的照片书  | 最近在使用jenkins中踩了不少雷.Jenkins作为CI第一大神器,拥有庞大的1058个扩展插件.也许你要的答案就在里面,但是如果没有好好学习,她也可能把你搞的生活无法自理~~理想是丰满的现实是骨干的,由于楼主

java中结合struts2自定义标签的使用

java中结合struts2自定义标签的使用 一.建立一个继承于SimpleTagSupport类实现它的doTag方法 1 package com.xiangshang.tag; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.PageContext; 8 import javax.serv

YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引擎优化. 但在MVC中,通常需要在应用程序启动时注册路由规则,该路由规则又通常和控制器进行了关联,也就是某个地址通常情况下都是有对应的控制器进行处理的.但在MVC中如何做到自定义动态路由,以便能在运行时通过某个控制器处理一些运行时动态设定的Url地址呢? 方法当然是有的:    1.首先实现一个动态

java server之spring中的IOC如何用java实现?

** 什么是IOC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: public class StaticCoupling { String s = new String("hzg1981"); } 的时候,类StaticCoupling在编译期间就跟String类耦合在了一起. 在代码静态分析时,就可以确认它们之间的耦合. 而IOC 则是在运行期间才使用assembler object绑定需要耦合的对象.绑定过程是由依赖注入(DI)实现的.需要注意的是IOC和DI是有区别

ArcGIS中添加进自定义的ttf字符标记符号

原文:ArcGIS中添加进自定义的ttf字符标记符号 ArcGIS系统中的样式可能不能满足实际生产需要,为了实现快速制图,可自定义一些样式,以便重复利用. 1.   制作的符号库 使用 FontCreator6.0工具制作ttf格式的arcgis的符号库.参考:Jingkunliu的ArcGIS使用字体文件制作符号库!这篇博客. 2.   安装ttf字体符号库 字体包中包含了自定义的一些符号样式,在正式使用样式之前,必须安装.ttf的字体包. 安装字体的包的方式有以下两种,二选一即可: 1) 找

The Courtyard demo中的Game视图相机同步

The Courtyard的demo中,会发现Scene视图和Game视图是编辑器下同步的,它通过一个CopySceneView.cs脚本实现 Scene视图和Game视图的显示效果还是有区别的,毕竟有相机滤镜.同步后可以更好的调试

如何在SharePoint中配置和自定义Content Query Web Part

如何在SharePoint中配置和自定义Content Query Web Part 2014-01-07 11:15 718人阅读 评论(0) 收藏 举报 之前有一篇blog提到过SharePoint中的Content Query Web Part (CQWP),说的是当SharePoint开启了匿名访问模式后,Content Query Web Part读取Document Library数据失败的问题.从这篇博客开始,我将说一下Content Query Web Part这个东西能做什么,