`
nacu
  • 浏览: 16376 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

用C# 3.0 写了个IoC类

    博客分类:
  • .net
阅读更多
虽然c# Meta programing 的能力不够
不过新特性还是比较爽的
用这些写了个IoC类
挺有意思
c# 代码
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using NUnit.Framework;  
  6.   
  7. namespace Test  
  8. {  
  9.     /// <summary></summary>  
  10.     /// service interface  
  11.     ///   
  12.     public interface IComponentService<t>  </t>
  13.     {  
  14.         T GetComponent();  
  15.     }  
  16.   
  17.     /// <summary></summary>  
  18.     /// normal service  
  19.     ///   
  20.     public class SingleComponentService<t>:IComponentService<t>  </t></t>
  21.     {  
  22.         private Func
  23.         private MicroContainer container;  
  24.   
  25.         public SingleComponentService(MicroContainer container,Func
  26.         {  
  27.             this.container = container;  
  28.             this.registerFunction = registerFunction;  
  29.         }  
  30.  
  31.         #region IComponentService Members  
  32.   
  33.         public T GetComponent()  
  34.         {  
  35.             return (T)this.registerFunction(this.container);  
  36.         }  
  37.  
  38.         #endregion  
  39.     }  
  40.   
  41.     /// <summary></summary>  
  42.     /// singleton service  
  43.     ///   
  44.     public class CachedComponentService<t>:IComponentService<t>  </t></t>
  45.     {  
  46.         private IComponentService<t> realService;  </t>
  47.   
  48.         private T result = default(T);  
  49.   
  50.         public CachedComponentService(IComponentService<t> realService)  </t>
  51.         {  
  52.             this.realService = realService;  
  53.         }  
  54.  
  55.         #region IComponentService Members  
  56.        
  57.         public T GetComponent()  
  58.         {  
  59.             if (this.result == null)  
  60.                 this.result = this.realService.GetComponent();  
  61.             return this.result;  
  62.         }  
  63.  
  64.         #endregion  
  65.     }  
  66.   
  67.     public class ServiceNotExistException : Exception  
  68.     {  
  69.         public ServiceNotExistException(string message):base(message)  
  70.         {   
  71.         }  
  72.     }  
  73.   
  74.   
  75.     /// <summary></summary>  
  76.     /// 小型Micro 容器  
  77.     /// todo: 1 父容器         -ok  
  78.     ///       2 service regist -ok  
  79.     ///       3 generic        -ok  
  80.     ///       4 singlton,lazy initial -ok  
  81.     ///       5 aop,attribute driver ,define to kernelSupport  
  82.     ///   
  83.     public class MicroContainer  
  84.     {  
  85.         private IDictionary<stringobject> componets  
  86.                                      = new Dictionary<stringobject>();  
  87.   
  88.         private MicroContainer parentContainer;  
  89.   
  90.   
  91.         public MicroContainer():this(null)  
  92.         {  
  93.         }  
  94.   
  95.         public MicroContainer(MicroContainer parentContainer)  
  96.         {  
  97.             this.parentContainer = parentContainer;  
  98.         }  
  99.   
  100.         /// <summary></summary>  
  101.         /// 注册服务  
  102.         ///   
  103.         ///   
  104.         ///   
  105.         ///   
  106.         public void Register<t>(</t>string key, Func
  107.         {  
  108.             this.componets.Add(key, new SingleComponentService<t>(</t>this,registerFunction));  
  109.         }  
  110.   
  111.         /// <summary></summary>  
  112.         /// 注册singleton服务  
  113.         ///   
  114.         ///   
  115.         ///   
  116.         ///   
  117.         public void RegisterSingleton<t>(</t>string key, Func
  118.         {  
  119.             this.componets.Add(key, new CachedComponentService<t>(</t>new SingleComponentService<t>(</t>this,registerFunction)));  
  120.         }  
  121.   
  122.         /// <summary></summary>  
  123.         /// 注册服务  
  124.         ///   
  125.         ///   
  126.         ///   
  127.         ///   
  128.         public void RegisterService<t>(</t>string key,IComponentService<t> service)  </t>
  129.         {  
  130.             this.componets.Add(key, service);  
  131.         }  
  132.   
  133.         /// <summary></summary>  
  134.         /// 取得组件  
  135.         ///   
  136.         ///   
  137.         ///   
  138.         /// <returns>组件</returns>  
  139.         public T GetComponent<t>(</t>string key)  
  140.         {  
  141.             if (this.componets.ContainsKey(key))  
  142.                 return ((IComponentService<t>)</t>this.componets[key]).GetComponent();  
  143.   
  144.   
  145.             if (this.parentContainer != null)  
  146.                 return this.parentContainer.GetComponent<t>(key);  </t>
  147.             else  
  148.                 throw new ServiceNotExistException("component not exist:" + key);  
  149.         }  
  150.     }   
  151. }  


使用方法如下
测试类:
c# 代码
 
  1. public class MainClass  
  2.         {  
  3.             public string Name { getset; }  
  4.   
  5.             public int DoTimes { getset; }  
  6.   
  7.             public FirstInterface Sth { getset; }  
  8.   
  9.             public void Run()  
  10.             {  
  11.                 for (int i = 0; i < this.DoTimes; i++)  
  12.                 {  
  13.                     this.Sth.Run(this.Name);  
  14.                 }  
  15.             }  
  16.   
  17.             public void RunForMetaCall()  
  18.             {  
  19.                 Console.WriteLine("meta method call");  
  20.             }  
  21.   
  22.             public string MethodMissing(string name)  
  23.             {  
  24.                 return "hello" + name;  
  25.             }  
  26.         }  
  27.   
  28.         public interface FirstInterface  
  29.         {  
  30.             void Run(string name);  
  31.         }  
  32.   
  33.         public class FirstClass : FirstInterface  
  34.         {  
  35.             #region FirstInterface Members  
  36.   
  37.             public void Run(string name)  
  38.             {  
  39.                 Console.WriteLine("first hello {0}", name);  
  40.             }  
  41.  
  42.             #endregion  
  43.         }  
  44.   
  45.         public class SecondClass : FirstInterface  
  46.         {  
  47.             #region FirstInterface Members  
  48.   
  49.             public void Run(string name)  
  50.             {  
  51.                 Console.WriteLine("second hello {0}", name);  
  52.             }  
  53.  
  54.             #endregion  
  55.         }  

c# 代码
 
  1. var parentContainer = new MicroContainer();  
  2.   
  3.   
  4.             var container = new MicroContainer(parentContainer);  
  5.   
  6.   
  7.   
  8.             container.Register<firstinterface>("FirstClass", c => new FirstClass());  </firstinterface>
  9.   
  10.             container.Register("Name", c => "xiao li");  
  11.             container.Register("Name2", c => "xiao zhang");  
  12.   
  13.             container.Register("Times", c => 3);  
  14.             container.Register("Times2", c => 1);  
  15.   
  16.             container.Register("MainClass",  
  17.                 c => new MainClass  
  18.                      {  
  19.                          Name = c.GetComponent<string>("Name2"),  
  20.                          DoTimes = c.GetComponent<int>("Times2"),  
  21.                          Sth = c.GetComponent<firstinterface>("SecondClass")  </firstinterface>
  22.                      });  
  23.   
  24.             parentContainer.Register<firstinterface>("SecondClass",  </firstinterface>
  25.                 c => new SecondClass());  
  26.   
  27.   
  28.   
  29.             var mainClass = container.GetComponent<mainclass>("MainClass");  </mainclass>
  30.             mainClass.Run();  
分享到:
评论

相关推荐

    [IoC容器] Autofac 3.0.2

    Autofac is an IoC container for Microsoft .NET. It manages the dependencies between classes so that applications stay easy to change as they grow in size and complexity. This is achieved by treating ...

    FastSpring.net V3.0全部源码

    FastSpring.net是一个基于C#和.NET框架的开源项目,其V3.0版本的源码具有重要的学习和研究价值。自V2.5之后,作者停止了更高版本的更新,使得V3.0成为了一个里程碑式的版本。本文将对FastSpring.net V3.0的源码进行...

    C#高级教程(PPT+源码)

    - **Lambda表达式**:C#3.0引入的特性,用于简洁地定义匿名函数,常在LINQ查询中使用。 - **匿名类型**:动态创建类型,用于临时数据存储,常在 LINQ 查询结果中使用。 - **扩展方法**:允许向已存在的类添加新...

    c#程序开发宝典 (第二版)19-20 源码

    Lambda表达式是C#3.0引入的,语法简洁,更便于编写 LINQ 查询。 4. **匿名类型**:在不需要为数据创建单独的类时,可以使用匿名类型来存储一组相关的值。 5. **扩展方法**:允许向现有类型添加新方法,而无需继承...

    Asp.net MVC3.0教程

    6. **模型(Model)**:创建模型类,理解数据绑定,使用数据注解进行验证。 7. **辅助方法(Assistants)**:学习如何使用HTML辅助方法,使视图代码更整洁。 8. **验证(Validation)**:了解客户端和服务器端验证,以及...

    asp.net mvc 3.0 增删改查

    ASP.NET MVC 3.0 是一个强大的Web应用程序框架,由微软开发,用于构建高度可测试、灵活和控制力强的Web应用。它结合了ASP.NET的功能、Model-View-Controller(MVC)设计模式和razor视图引擎,为开发者提供了高效、...

    Castle简单实例

    Castle DynamicProxy是一个用于创建代理类的库,它可以动态地生成类的代理,用于拦截方法调用、属性访问等,这对于实现AOP(面向切面编程)非常有用。开发者可以利用DynamicProxy来添加额外的行为,如日志记录、事务...

    不使用任何向导在C#中编码N层应用程序:第二部分

    在C#中构建一个N层应用程序,即分层架构的应用程序,是软件开发中的常见实践,它可以提高代码的可维护性、可扩展性和模块化。本篇内容将深入探讨如何在不依赖任何向导的情况下手动实现这一过程。不使用向导意味着...

    Spring源码深度解析与注解驱动开发1

    `AnnotationConfigApplicationContext`是Spring 3.0引入的一个类,它允许我们使用Java配置而不是XML来创建和管理bean。通过注解,我们可以直接在类或方法上声明bean的定义,简化了配置过程。 2. 组件添加:在传统的...

    开发松耦合的Silverlight 3应用程序

    首先,**C#编程语言**是Silverlight开发的主要工具之一,无论是C#3.0还是C#2.0,它们都提供了面向对象的特性,如接口、继承和泛型,为开发高效代码提供了支持。**.NET Framework**,特别是.NET3.5,提供了丰富的类库...

    MF00639-.NET Core前后端分离快速开发框架.zip

    后端:采用.NET Core平台,ASP.NET Core3.1,C#语言(使用反射等高级技术),Entity FrameworkCore(数据库ORM框架)。 使用数据仓储模式,抽象化数据库操作(CRUD等)、支持事务处理以及分布式事务处理(跨库) 支持...

    使用Windsor Castle进行延迟加载

    4. **System.Lazy**:这是.NET Framework提供的一个类,用于实现延迟初始化。它包含一个内部状态,表示对象是否已经被初始化,以及一个线程安全的初始化过程,确保对象在多线程环境中正确地被懒加载。 5. **集成...

    ASP.NET 3.5 MVC 架构与事件源代码第 三部分实战篇

    ASP.NET MVC支持Razor视图引擎,允许开发者使用C#语法直接在HTML中编写代码,提高了开发效率。 6. **模型(Model)**:模型包含了应用程序的数据和业务逻辑。在ASP.NET MVC中,模型通常由实体类或数据访问层(DAL)...

    MyEclipse 6 Java开发教程[优化整合版]

    - **EJB3**:探索企业Java Beans 3.0的新特性,如会话Bean、消息驱动Bean等。 #### 六、综合案例分析 - **实战案例**:通过一个具体的案例,综合运用Spring、Struts、Hibernate等技术栈,实现一个完整的Java EE...

    在WPF中将RoutedCommands下沉到ViewModel命令

    RoutedCommands是WPF中的一个类,它实现了命令功能并提供了事件路由机制。这意味着当一个RoutedCommand被触发时,它不仅会在发出命令的控件上执行,还会沿着UI树向上和向下传播,允许其他控件响应。在传统的WPF应用...

Global site tag (gtag.js) - Google Analytics