C#反射Assembly IoC的一个实例

1.定义一个抽象类ServiceFactory,用来得到T接口的实现对象

public abstract class ServiceFactory
{
    public abstract T CreateService<T>() where T : class;
}

2.首先通过反射机制得到该interface的名字。得到该interface的实现实例后并缓存它。

/// <summary>
/// 直接引用提供服务
/// </summary>
public class RefServiceFactory : ServiceFactory
{
    public override T CreateService<T>()
    {
        //第一次通过反射创建服务实例,然后缓存住
        var interfaceName = typeof(T).Name;
        return CacheHelper.Get<T>(string.Format("Service_{0}", interfaceName), () =>
            {
                return AssemblyHelper.FindTypeByInterface<T>();
            });
    }
}

3.AssemblyHelper.FindTypeByInterface<T>();

该方法会在项目下的bin文件夹内查找dll文件,然后再去检测dll文件中的具体类

interfaceType.IsAssignableFrom(type) 判断type是否interfaceType的实现类
Activator.CreateInstance(type) 创建type类型的实例

/// <summary>
/// 扫描程序集找到实现了某个接口的第一个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="searchpattern">文件名过滤</param>
/// <returns></returns>
public static T FindTypeByInterface<T>(string searchpattern = "*.dll") where T : class
{
    var interfaceType = typeof(T);

    string domain = GetBaseDirectory();
    string[] dllFiles = Directory.GetFiles(domain, searchpattern, SearchOption.TopDirectoryOnly);

    foreach (string dllFileName in dllFiles)
    {
        foreach (Type type in Assembly.LoadFrom(dllFileName).GetLoadableTypes())
        {
            if (interfaceType != type && interfaceType.IsAssignableFrom(type))
            {
                var instance = Activator.CreateInstance(type) as T;
                return instance;
            }
        }
    }

    return null;
}

/// <summary>
/// 得到当前应用程序的根目录
/// </summary>
/// <returns></returns>
public static string GetBaseDirectory()
{
    var baseDirectory = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;

    if (AppDomain.CurrentDomain.SetupInformation.PrivateBinPath == null)
        baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

    return baseDirectory;
}
时间: 2024-10-14 00:46:11

C#反射Assembly IoC的一个实例的相关文章

通过反射创建自定义泛型的实例。

比如有这样一个泛型:Demo.GenericsSimple<T,TT> 我想要通过反射创建一个Demo.GenericsSimple<string,int>的实例可以通过下面的格式进行创建: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.User`形参数量N[[1形参类型全名,形参类型所在的程 序集名称],[2形参类型全名,形参类型所在的程序集名称],[3形参类型全名,形参类型

C# 反射 通过类名创建类实例

“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 上上篇博文[SSH进阶之路]一步步重构容器实现Spring框架--

Spring中IoC的入门实例

Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的. 数据模型 1.如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类. 源代码如下: package cn.com.chengang.spring;public interface Human {void eat();

通过反射实现IOC功能

这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六,女朋友去加班了(也是一枚标准的程序媛,做java开发),闲来没事,自己就想着根据反射可以自己写一个简易的IOC组件.IOC组件说白了就是根据反射实例化对应的接口.废话不多说,开始说说我的解决方案. 1.项目结构图: IOCTest为web MVC项目. Common 通过配置文件实例化对应的接口

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

转 C# 只允许运行一个实例

来源:http://blog.csdn.net/jin20000/article/details/3136791 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允 许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的.  要实现程序的互斥,通常有三中方式,下面 用 C#  语言来实现: 实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如

Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例 --转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java 反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是 旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭 对话框,后续如果用到会另外总结~ 本节正文: 1.反射的相关