Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过反射实现IOC功能

通过反射实现IOC功能

作者头像
写代码的猿
发布于 2019-04-11 06:39:46
发布于 2019-04-11 06:39:46
66200
代码可运行
举报
文章被收录于专栏:平凡少年平凡少年
运行总次数:0
代码可运行

这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac、Ninject、Utity包括.NET自带的MEF等。由于今天周六,女朋友去加班了(也是一枚标准的程序媛,做java开发),闲来没事,自己就想着根据反射可以自己写一个简易的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类中我们定义一个接口,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IBLL
{
  public  interface IHelloWord
    {
      string SayHello(string Name);
    }
}

(2)BLL层实现接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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对应起来):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <appSettings>
    <add key="IBLL.IHelloWord" value="BLL,BLL.HelloWord"/>
  </appSettings>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);//key
            Type type = s_type[t] as Type;//value
            if (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文件,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
        }

    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "Index";
}

<h2>@ViewBag.Message </h2>

最后上一张截图:

到此结束,准备收拾收拾下楼去吃饭,下午去国家图书馆看书,后续把AutoFac、Ninject、Utity总结一下,感觉Ninject比较好用,有兴趣的同学可以研究一下。

每天学习一点点,每天进步一点点。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-09-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【专业技术】反射技术探究
反射 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为反射机制。反射机制动态获取方法并使用方法和自己直接创建一个类的对象去直接调用时完全不一样的。比如一个类里面有一个属性为private的属性或者方法,我们是不能直接去调用的,但是可以使用反射机制去动态调用。 IOC IOC最大的好处是把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于
程序员互动联盟
2018/03/16
7530
【专业技术】反射技术探究
.NET自带IOC容器MEF之初体验
本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spring.Net等,这些第三方工具各不相同,但功能大体都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动或手动来通过接口来获得相应实现类的实例,对象实例化的工作由IOC容器自动完成。
写代码的猿
2019/04/11
2K0
.NET自带IOC容器MEF之初体验
ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
最近比较忙,系统难度独步增加,文章的发布速度明显比以前慢了。 由于我们已经跑通了整个系统,所有东西都回到了简单,接下来我们做模块制作也就是操作SysModule表。 首先我们来回顾一下之前的难点主要就是SysRight这个表Rightflag字段的改变,这个字段关系导航与角色组的关系显示(即有权限时候显示菜单导航,这个更新讲到授权讲到,在这里浮头一下) 所以我们操作SysModule必须更新SysRight这张表,把模块先分配给角色 所以思路已经比较明显和简单了,这里我们模块将用treegrid来做,同时也
用户1149182
2018/01/16
5.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
接下来我们的目标是 角色组管理 角色组权限设置 用户管理 把角色组授权给用户 给用户分配角色组 所以最少我们还要讲多5讲才能结束这个管理系统,经过之前的样例程序,我们很熟悉这个套路了,如果你很喜欢这个
用户1149182
2018/01/16
8540
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
系统需要越来越自动化,我们需要引入日志记录和异常捕获 管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的。 系统的异常需要被捕获,而不是将系统出错显示出来给用户就不了了知。我们需要异常日志不断改进系统。 我们老说用户,我们还没有用户权限的表,所以我们在Home中先加入一个虚拟用户吧! 首先我们创建一个用户类AccountModel放在App.Models下的Sys文件夹下 using System; using System.Collections.Generic
用户1149182
2018/01/16
2K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来。 首先我们在App.Common类库中创建一个通用类ResultHelper,这个类里面写了,获取一个GUID,获取当前时间,处理字符串等操作,虽然我们目前要用到的一个就是获取GUID但是以后我们可能还要用到别的,所以我都把他放进入了 然后在App.Admin创建一个核心文件夹,Core,放入LogHandler这个类是主要是写入日志,避免在每次都要实例化这个类,我把他封装起来,大家一看就知道。 然后修改Controller的Creat
用户1149182
2018/01/16
1.1K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/releases得到最新版本的Unity现在。 这里http://unity.codeplex.com/documentation我们找到了帮助文档大家可以下载下来看看 当然,如果您在您的visual studio 中安装了Nuget 包管理器,你可以直接在Nuget中获取到最新版本的Unity。 我们采用的是构造
用户1149182
2018/01/16
8730
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
反射学习由浅入深
第一,引入:dll的引入方法  通过当前控制台应用程序的引用的添加(解决方案下的引用)     再到命名空间的引用(使用类中的引用)
wfaceboss
2019/04/08
4150
反射学习由浅入深
基于EntityFramework 6 Code First实现多租户的一种思路
公司原本有一个“xx系统”,ORM使用EntityFramework,Code First模式。该系统是针对某个客户企业的,现要求该系统支持多个企业使用,但是又不能给每个企业部署一份(难以维护),只能想办法从代码层面去解决这个问题。
xhznl
2020/08/14
6380
深入浅出三层架构
这几天看了不少三层架构的资料,整理整理 ——故写篇博文谈谈自己的看法。 三层架构概念: 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想,复杂项目不能把SQL语句直接写到程序里,不模块话,难以维护。应该采取三层架构。 1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 2、业务逻辑层(BLL):针对具体问题的操作,也可以
用户1161731
2018/01/11
1.3K0
深入浅出三层架构
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层
第一步:设计IDao层。在MyWeb.WebTemp.IDao项目中添加IUserDao接口。代码如下:
老马
2022/05/10
4650
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层
控制反转-Ioc之Unity
本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc。在介绍的时候,会尽量结合代码来讲解一些概念。
少羽大怪兽
2019/09/11
7240
控制反转-Ioc之Unity
Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装。 Dapper的用法比较接近ADO.NET所以性能也是比较快。所以我们先来看看使用ADO.NET的时候我们怎么实现代码复用的封装。 ◆ 一、ADO.NET的封装案例 利用反射对ADO.NET进行封装,看代码: DBHelper.cs:这边用的是mysql,如果要用sqlserver将MySqlConnection换成SqlConnection即可。 这个写的比较简单,如果有复杂的sql可能就支
IT大咖说
2022/03/14
3.1K0
AOP:使用命令模式实现AOP
某位大牛说过,采用命名模式的好处是,你可以将命令按照不同的方式执行,如:排队、异步、远程和拦截等等。今天我介绍一下如何拦截命令的执行,这有些AOP的味道。
全栈程序员站长
2022/07/05
3750
AOP:使用命令模式实现AOP
深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC、DI以及Ioc容器等概念。通过本文我们将一起学习这些概念,并理清他们之间微妙的关系。 ---- 目录 前言 依赖倒置原则(DIP) 控制反转(IoC) 依赖注入(DI) IoC容器 总结 ---- 前言 对于大部分小菜来说,当听到大牛们高谈DIP、IoC、DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些“高大上”的名词,理解起来也并不是那么的难
刘皓
2018/04/03
1.2K0
深入理解DIP、IoC、DI以及IoC容器
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实现 首先要让DataGrid支持分页,我们需要在JS Datagrid中加入下列几个属性 是否启用分页:pagination 默认是false 每页数量:pageSize 默认10 可选择每页数量:pageList 默认[10,20,30,40,50] 排序字段:sortName 默认null 排序类型:sortO
用户1149182
2018/01/16
1.3K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
这一节我们来跑通整个系统,验证的流程,通过AOP切入方式,在访问方法之前,执行一个验证机制来判断是否有操作权限(如:增删改等) 原理:通过MVC自带筛选器,在筛选器分解路由的Action和contro
用户1149182
2018/01/16
2.5K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
(Head First 设计模式)学习笔记(1)
把书中开篇duck问题的代码翻译成了c#版: 概述: 某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子,飞行方式和叫唤的方式各不相同 以下代码体现了二个oo原则: 1.找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起 2.针对接口编程,而不是针对实现编程 Duck抽象类: using System; using System.Collections.Generic; using System.Linq;
菩提树下的杨过
2018/01/22
5800
三层与mvc
说明,每一张表对应有crud综合分析可以得知区别在于对应的类型不同以及一些参数不一样,
wfaceboss
2019/04/08
7200
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (二)创建你的项目
本篇文章的目的:首先是创建解决方案。并创建相关的项目。先介绍一下项目的各自的作用:
老马
2022/05/10
3200
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (二)创建你的项目
推荐阅读
相关推荐
【专业技术】反射技术探究
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验