虽然c# Meta programing 的能力不够
不过新特性还是比较爽的
用这些写了个IoC类
挺有意思
c# 代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using NUnit.Framework;
-
- namespace Test
- {
-
-
-
- public interface IComponentService<t> </t>
- {
- T GetComponent();
- }
-
-
-
-
- public class SingleComponentService<t>:IComponentService<t> </t></t>
- {
- private Func
- private MicroContainer container;
-
- public SingleComponentService(MicroContainer container,Func
- {
- this.container = container;
- this.registerFunction = registerFunction;
- }
-
- #region IComponentService Members
-
- public T GetComponent()
- {
- return (T)this.registerFunction(this.container);
- }
-
- #endregion
- }
-
-
-
-
- public class CachedComponentService<t>:IComponentService<t> </t></t>
- {
- private IComponentService<t> realService; </t>
-
- private T result = default(T);
-
- public CachedComponentService(IComponentService<t> realService) </t>
- {
- this.realService = realService;
- }
-
- #region IComponentService Members
-
- public T GetComponent()
- {
- if (this.result == null)
- this.result = this.realService.GetComponent();
- return this.result;
- }
-
- #endregion
- }
-
- public class ServiceNotExistException : Exception
- {
- public ServiceNotExistException(string message):base(message)
- {
- }
- }
-
-
-
-
-
-
-
-
-
-
- public class MicroContainer
- {
- private IDictionary<string, object> componets
- = new Dictionary<string, object>();
-
- private MicroContainer parentContainer;
-
-
- public MicroContainer():this(null)
- {
- }
-
- public MicroContainer(MicroContainer parentContainer)
- {
- this.parentContainer = parentContainer;
- }
-
-
-
-
-
-
-
- public void Register<t>(</t>string key, Func
- {
- this.componets.Add(key, new SingleComponentService<t>(</t>this,registerFunction));
- }
-
-
-
-
-
-
-
- public void RegisterSingleton<t>(</t>string key, Func
- {
- this.componets.Add(key, new CachedComponentService<t>(</t>new SingleComponentService<t>(</t>this,registerFunction)));
- }
-
-
-
-
-
-
-
- public void RegisterService<t>(</t>string key,IComponentService<t> service) </t>
- {
- this.componets.Add(key, service);
- }
-
-
-
-
-
-
-
- public T GetComponent<t>(</t>string key)
- {
- if (this.componets.ContainsKey(key))
- return ((IComponentService<t>)</t>this.componets[key]).GetComponent();
-
-
- if (this.parentContainer != null)
- return this.parentContainer.GetComponent<t>(key); </t>
- else
- throw new ServiceNotExistException("component not exist:" + key);
- }
- }
- }
使用方法如下
测试类:
c# 代码
- public class MainClass
- {
- public string Name { get; set; }
-
- public int DoTimes { get; set; }
-
- public FirstInterface Sth { get; set; }
-
- public void Run()
- {
- for (int i = 0; i < this.DoTimes; i++)
- {
- this.Sth.Run(this.Name);
- }
- }
-
- public void RunForMetaCall()
- {
- Console.WriteLine("meta method call");
- }
-
- public string MethodMissing(string name)
- {
- return "hello" + name;
- }
- }
-
- public interface FirstInterface
- {
- void Run(string name);
- }
-
- public class FirstClass : FirstInterface
- {
- #region FirstInterface Members
-
- public void Run(string name)
- {
- Console.WriteLine("first hello {0}", name);
- }
-
- #endregion
- }
-
- public class SecondClass : FirstInterface
- {
- #region FirstInterface Members
-
- public void Run(string name)
- {
- Console.WriteLine("second hello {0}", name);
- }
-
- #endregion
- }
c# 代码
- var parentContainer = new MicroContainer();
-
-
- var container = new MicroContainer(parentContainer);
-
-
-
- container.Register<firstinterface>("FirstClass", c => new FirstClass()); </firstinterface>
-
- container.Register("Name", c => "xiao li");
- container.Register("Name2", c => "xiao zhang");
-
- container.Register("Times", c => 3);
- container.Register("Times2", c => 1);
-
- container.Register("MainClass",
- c => new MainClass
- {
- Name = c.GetComponent<string>("Name2"),
- DoTimes = c.GetComponent<int>("Times2"),
- Sth = c.GetComponent<firstinterface>("SecondClass") </firstinterface>
- });
-
- parentContainer.Register<firstinterface>("SecondClass", </firstinterface>
- c => new SecondClass());
-
-
-
- var mainClass = container.GetComponent<mainclass>("MainClass"); </mainclass>
- mainClass.Run();
分享到:
相关推荐
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是一个基于C#和.NET框架的开源项目,其V3.0版本的源码具有重要的学习和研究价值。自V2.5之后,作者停止了更高版本的更新,使得V3.0成为了一个里程碑式的版本。本文将对FastSpring.net V3.0的源码进行...
- **Lambda表达式**:C#3.0引入的特性,用于简洁地定义匿名函数,常在LINQ查询中使用。 - **匿名类型**:动态创建类型,用于临时数据存储,常在 LINQ 查询结果中使用。 - **扩展方法**:允许向已存在的类添加新...
Lambda表达式是C#3.0引入的,语法简洁,更便于编写 LINQ 查询。 4. **匿名类型**:在不需要为数据创建单独的类时,可以使用匿名类型来存储一组相关的值。 5. **扩展方法**:允许向现有类型添加新方法,而无需继承...
6. **模型(Model)**:创建模型类,理解数据绑定,使用数据注解进行验证。 7. **辅助方法(Assistants)**:学习如何使用HTML辅助方法,使视图代码更整洁。 8. **验证(Validation)**:了解客户端和服务器端验证,以及...
ASP.NET MVC 3.0 是一个强大的Web应用程序框架,由微软开发,用于构建高度可测试、灵活和控制力强的Web应用。它结合了ASP.NET的功能、Model-View-Controller(MVC)设计模式和razor视图引擎,为开发者提供了高效、...
Castle DynamicProxy是一个用于创建代理类的库,它可以动态地生成类的代理,用于拦截方法调用、属性访问等,这对于实现AOP(面向切面编程)非常有用。开发者可以利用DynamicProxy来添加额外的行为,如日志记录、事务...
在C#中构建一个N层应用程序,即分层架构的应用程序,是软件开发中的常见实践,它可以提高代码的可维护性、可扩展性和模块化。本篇内容将深入探讨如何在不依赖任何向导的情况下手动实现这一过程。不使用向导意味着...
`AnnotationConfigApplicationContext`是Spring 3.0引入的一个类,它允许我们使用Java配置而不是XML来创建和管理bean。通过注解,我们可以直接在类或方法上声明bean的定义,简化了配置过程。 2. 组件添加:在传统的...
首先,**C#编程语言**是Silverlight开发的主要工具之一,无论是C#3.0还是C#2.0,它们都提供了面向对象的特性,如接口、继承和泛型,为开发高效代码提供了支持。**.NET Framework**,特别是.NET3.5,提供了丰富的类库...
后端:采用.NET Core平台,ASP.NET Core3.1,C#语言(使用反射等高级技术),Entity FrameworkCore(数据库ORM框架)。 使用数据仓储模式,抽象化数据库操作(CRUD等)、支持事务处理以及分布式事务处理(跨库) 支持...
4. **System.Lazy**:这是.NET Framework提供的一个类,用于实现延迟初始化。它包含一个内部状态,表示对象是否已经被初始化,以及一个线程安全的初始化过程,确保对象在多线程环境中正确地被懒加载。 5. **集成...
ASP.NET MVC支持Razor视图引擎,允许开发者使用C#语法直接在HTML中编写代码,提高了开发效率。 6. **模型(Model)**:模型包含了应用程序的数据和业务逻辑。在ASP.NET MVC中,模型通常由实体类或数据访问层(DAL)...
- **EJB3**:探索企业Java Beans 3.0的新特性,如会话Bean、消息驱动Bean等。 #### 六、综合案例分析 - **实战案例**:通过一个具体的案例,综合运用Spring、Struts、Hibernate等技术栈,实现一个完整的Java EE...
RoutedCommands是WPF中的一个类,它实现了命令功能并提供了事件路由机制。这意味着当一个RoutedCommand被触发时,它不仅会在发出命令的控件上执行,还会沿着UI树向上和向下传播,允许其他控件响应。在传统的WPF应用...