通过反射实现IOC功能

闲来没事,自己就想着根据反射可以自己写一个简易的IOC组件。IOC组件说白了就是根据反射实例化对应的接口。废话不多说,开始说说我的解决方案。

1、项目结构图:

  • IOCTest为web MVC项目。

  • Common 通过配置文件实例化对应的接口

  • IBLL定义的接口

  • BLL实现接口

2、引用

  1. IOCTest项目引用IBLL、Common项目,不能引用BLL项目,这样就使IOCTest项目只依赖接口。

  2. BLL项目引用IBLL并实现接口

  3. 修改BLL项目dll生成路径,使其DLL生成到IOCTest项目的Bin目录下,如下图设置

 

3、下面我们来看具体的实现

(1)在IBLL层的IHelloWord.cs类中我们定义一个接口,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace IBLL
{public  interface IHelloWord{string SayHello(string Name);}
}
br

(2)BLL层实现接口‍

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBLL;namespace BLL
{public class HelloWord:IHelloWord{#region IHelloWord 成员public string SayHello(string Name){return  "Hello_"+Name;}#endregion}}

(3)在IOCTest 项目的根目录Web.config下做如下配置(把HelloWord和IHelloWord对应起来):

<appSettings><add key="IBLL.IHelloWord" value="BLL,BLL.HelloWord"/></appSettings>说明:  key值为接口的全称(命名空间+类名),value值为实现接口的类,两部分组成,逗号前面为生成的dll名称,逗号后面为类名全称(命名空间+类名)。

(4)Common 项目的IOCReflecter.cs类根据配置文件获取对应接口的实例化对象,代码实现如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Reflection;
using System.Configuration;namespace Common
{public class IOCReflecter{private static Hashtable s_type=null;static IOCReflecter(){s_type = new Hashtable();}public static T CreateIntance<T>(){Type t=typeof(T);//keyType type = s_type[t] as Type;//valueif (type == null){string[] AssemblyInfos = ConfigurationManager.AppSettings[t.FullName].Split(',');type = Assembly.Load(AssemblyInfos[0]).GetType(AssemblyInfos[1]);s_type.Add(t, type);}return (T)CreateObject(type) ;}/// <summary>/// 根据typeName获取Type对象/// </summary>/// <param name="typeName"></param>/// <returns></returns>public static Type GetType(string typeName){if (string.IsNullOrWhiteSpace(typeName)){return null;}return Type.GetType(typeName);}/// <summary>/// 获取对象/// </summary>/// <param name="t"></param>/// <returns></returns>private static object CreateObject(Type t){if (t == null){return null;}//查找没有参数的构造函数//如果需要初始化带参数的构造函数 t.GetConstructors() 获取所有的构造函数 ,it.GetParameters()获取构造函数所有的参数,ConstructorInfo NonParameterConstructors= t.GetConstructors().Where(it=>it.GetParameters().Length==0).FirstOrDefault();if (NonParameterConstructors == null){throw new Exception( t.FullName+"必须有一个无参数或默认的构造函数");}//调用数构造函数创建对象return t.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);}}
}

(5)测试

在IOCTest项目Controllers中添加HomeController.cs文件,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using IBLL;
using Common;namespace IOCTest.Controllers
{public class HomeController : Controller{//// GET: /Home/public ActionResult Index(){//获取实例化对象IHelloWord hello = IOCReflecter.CreateIntance<IHelloWord>();ViewBag.Message = hello.SayHello("eric");return View();}}
}
@{ViewBag.Title = "Index";
}<h2>@ViewBag.Message </h2>

最后上一张截图:

到此结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 分享微博,php微信分享到朋友圈、QQ、朋友、微博

本文实例为大家分享了php微信分享到朋友圈、QQ、朋友、微博的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下前台代码wx.config({debug: false,appId: "{$signPackage[appId]}",timestamp: "{$signPackage[timestamp]}",nonceStr: "{$signP…

base函数

Basename函数 参考资料 http://monkeymusic.blog.163.com/blog/static/4797639200912533652666/ 解释 basename - strip directory and suffix from filenames 去除给出字符串的前缀例子 Shell命令&#xff1a;basename a/b/c/d/test/a.ppt 输出&#xff1a;a.ppt 可以在后面添…

如果这个世界都不按套路出牌将会变成怎么样。。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;请你有话“直”说↓ ↓ ↓

晁錯論

晁錯論 〈晁錯論〉 天下之患&#xff0c;最不可為者&#xff0c;名為治平無事&#xff0c;而其實有不測之憂。坐觀其變&#xff0c;而不為之所 &#xff0c;則恐至於不可救&#xff1b;起而強為之&#xff0c;則天下狃於治平之安而不吾信。惟仁人君子豪傑之士&#xff0c; 為能…

关于面试,避开这几点,成功几率更大~~~

概述 又是一个大学毕业季&#xff0c;刚好最近几年参与过很多面试&#xff0c;把其中遇到的一些具有“代表性”的面试场景总结出来和小伙伴聊聊&#xff0c;助力小伙伴跳过一些面试大坑(强烈希望)。对于面试&#xff0c;有很多小伙伴认为只是聊技术、聊能力&#xff0c;其实不仅…

脚本语言php是什么意思,php是什么脚本语言

PHP是一种简单的&#xff0c;面向对象的&#xff0c;解释型的&#xff0c;健壮的&#xff0c;安全的&#xff0c;性能非常之高的&#xff0c;独立于架构的&#xff0c;可移植的&#xff0c;动态的脚本语言。PHP具有和JAVA类似的Class关键字。因为不需要虚拟机&#xff0c;以致速…

[IOS地图开发系类]2、位置解码CLGeocoder

2019独角兽企业重金招聘Python工程师标准>>> 接第一步的操作&#xff0c;获取到地址信息经纬度后&#xff0c;我们可以对其进行解码&#xff0c;解码采用的CLGeocoder这个类&#xff0c;使用方式如下&#xff1a; 1、在ViewControlelr.m文件中声明一个CLGeocoder的…

微软相关的开发资源列表(update)

MSDN总站 http://www.msdn.com/MSDN中文站 http://www.microsoft.com/china/msdn/MSDN台湾站http://www.microsoft.com/taiwan/ASP.NET总站 http://www.asp.net/http://www.gotdotnet.com/SQLServerCentral.com is the largest free SQL Server community on the Internet. W…

备战数学建模国赛,快速搞定算法模型!

全世界只有3.14 % 的人关注了青少年数学之旅说到数学建模&#xff0c;大家的第一反应就是国赛、美赛等数学建模比赛&#xff0c;但这只是冰山一角&#xff0c;不过这个反应却也很正常&#xff0c;因为很多小伙伴接触数学建模的契机&#xff0c;大部分还是因为数学建模相关的竞赛…

考虑用Task.WhenAll

异步能在一定场景中带性能的飞跃&#xff0c;同步调用性能&#xff0c;也以带来时间的节省。先看一下被调用的api:using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Th…

wordpress home.php,WordPress主题通过function.php来加载js和css文件

WordPress主题开发的时候可以直接将需要的js或css写在head标签中&#xff0c;但是现在已经不主张这种加载方式了&#xff0c;现在WordPress主题通过function.php来加载js和css文件。基本架构//加载css及jsfunction wpdie_add_scripts() {wp_enqueue_style(style, get_template_…

Android应用程序之间共享文字和图片(一)

以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; import android.net.Uri; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; import android.app.Activity; import a…

国际数学大师评丘成桐:在哈佛,一人就是一个数学系

全世界只有3.14 %的人关注了青少年数学之旅丘成桐教授与蕉岭县乡亲们亲切交谈国际数学大师、阿贝尔奖获得者辛格评价丘成桐&#xff1a;“即使在哈佛&#xff0c;一个人就是一个数学系”《数学界的国王》是美国《纽约时报》刊登丘成桐人物报道的标题&#xff0c;此报道更是《纽…

你的密码已泄露!使用C#阻止弱密码

虽然&#xff0c;我们为了安全考虑&#xff0c;在注册用户时会检查密码规则&#xff0c;避免弱密码&#xff0c;比如百度的注册页面&#xff1a; 但是&#xff0c;现在的黑客也不会傻到用穷举的办法生成密码去攻击网站&#xff0c;更常用的方式是使用已泄露密码生成的字典。那这…

SVN的VS.NET插件——AnkhSVN

用了几个月SubVersionTortoiseSVN&#xff0c;感觉很不错。唯一美中不足的就是TortoiseSVN是在WINDOWS资源管理中进行操作的&#xff0c;在实际开发中&#xff0c;项目中新建了个文件&#xff0c;经常会忘记了将文件加入SVN管理。这样在下次提交时这个文件就不会被提交&#xf…

php 二维sort,php 二维数组排序

前提给定一个二维数组&#xff0c;请根据指定的数组key,写出最优的排序。排序条件age asc,sex desc&#xff0c;指定数组如下&#xff1a;$arr [[id>1, age>1, sex>6, name>a],[id>2, age>3, sex>1, name>c],[id>3, age>3, sex>1, name>b…

中国人数学好,数学思维差?

小天经常可以看到在微博热搜吐槽歪果仁数学不好的段子&#xff0c;比如6.8&#xff0c;我们习惯给11.8&#xff0c;让收银员找5块钱&#xff0c;但歪果仁就不行啦&#xff0c;这样他们会更乱&#xff01;所以我们容易觉得中国人数学好&#xff0c;算数特别快还准&#xff01;但…

Linux/Unix环境下的make命令详解

无论是在linux还是在Unix环境中&#xff0c;make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件&#xff0c;我们都经常要用到make或make install。利用make工具&#xff0c;我们可以将大型的开发项目分解成为多个更易于管理的模块&#xff0c;对于一个包…

[导入]心平气和,千佳骈集;意粗性躁,一事无成

以前自己常给别人说的一句话今天有人不经意间说给我听&#xff0c;颇觉其理——反正怎么过都是一天&#xff0c;还不如不要想那么多开心地过一天。经历挫折后&#xff0c;愈发觉到心胸开阔的重要。还是要作好总结与积累&#xff0c;由于工作忙已经一周没上CSDN回答问题了&#…

生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包...

序言最近一直在开发 webApi 接口&#xff0c;为了方便我采用了反Restful风格开发&#xff0c;90%的接口均采用post方式&#xff0c;小部分查询采用Get方式&#xff0c;接口的入参和出参定义每次都需要手动创建2个类&#xff0c;心不累手累&#xff0c;怎么能减轻点工作&#xf…