Spring.net-简易的IoC框架

两个类:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }

}

public class PersonDao
{
     private int intpro;
     public PersonDao(int intpro)
    {
        this.intpro = intpro;
    }
    public Person Entity { get; set; }
    public override string ToString()
    {
     return "构造函数参数intpro" + intpro ;
    }
}

Objects.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<objects>
<object id="person" type="SpringNet.Person,SpringNet">
<property name="Name" value="danche"></property>
<property name="Age" value="24"></property>
</object>

<object id="personDao" type="SpringNet.PersonDao,SpringNet">
<constructor-arg name="intpro" value="1"></constructor-arg>
<property name="Entity" ref="person"></property>
</object>

</objects>

Factory:

public class ObjectFactory
{
public IDictionary<string, object> objectContext = new Dictionary<string, object>();

private static ObjectFactory objfinstance;
private static object locHelper = new object();

private ObjectFactory(string filename)
{
//实例化Ioc容器
CreateContextContainer(filename);
//属性注入
PropertyZhuru(filename);
}

public static ObjectFactory Intance(string filename)
{
if(objfinstance==null)
{
lock(locHelper)
{
objfinstance=objfinstance??new ObjectFactory(filename);//如果objfinstance为null就实例化
}

}
return objfinstance;
}

/// <summary>
/// 实例化IoC容器
/// </summary>
/// <param name="filename">Objects.xml文件名</param>
private void CreateContextContainer(string filename)
{
XElement xmlroot = XElement.Load(filename);
var objects = from obj in xmlroot.Elements("object")
select obj;
//获得无参数构造
objectContext = objects.Where(c => c.Element("constructor-arg") == null).ToDictionary(
                         k => k.Attribute("id").Value,
                         v => {
                                   string typename = v.Attribute("type").Value;
                                   Type type = Type.GetType(typename);//获得类对象的类型
                                    return Activator.CreateInstance(type);
                                  }
);

//获得有参数构造
foreach (var obj in objects.Where(c => c.Element("constructor-arg") != null))
{
string k = obj.Attribute("id").Value;

string typename = obj.Attribute("type").Value;
Type type = Type.GetType(typename);

//返回指定类型的参数的值
var args = from oo in type.GetConstructors()[0].GetParameters()
                       join el in obj.Elements("constructor-arg")
                       on oo.Name equals el.Attribute("name").Value
                       select Convert.ChangeType(el.Attribute("value").Value, oo.ParameterType);

objectContext.Add(k,Activator.CreateInstance(type,args.ToArray()));

}

}
/// <summary>
/// 属性注入
/// </summary>
/// <param name="filename">Objects.xml文件名</param>
private void PropertyZhuru(string filename)
{
       XElement xmlroot = XElement.Load(filename);
       var objects = from obj in xmlroot.Elements("object")
       select obj;

foreach(KeyValuePair<string,object> ob in objectContext)
       {
             foreach (var el in objects.Where(c => c.Attribute("id").Value == ob.Key).Elements("property"))//获得xml中object下id为字典中保存的key的元素属性集合
            {
                Type type = ob.Value.GetType();//获得当前对象的类型
                foreach(var para in type.GetProperties())//当前对象的所有所有属性
               {
                     //给字典中保存的类对象的属性赋值
                    if(para.Name==el.Attribute("name").Value)
                     {

if(el.Attribute("value")!=null)
                            {
                                   para.SetValue(ob.Value,
                                                       Convert.ChangeType(el.Attribute("value").Value,
                                                       para.PropertyType), null);//给指定实例的属性设置新值

}
                           else if(el.Attribute("ref")!=null)
                          {
                                  if(objectContext.ContainsKey(el.Attribute("ref").Value))
                                   {
                                      var obj=objectContext[el.Attribute("ref").Value];
                                      para.SetValue(ob.Value,obj,null);
                                   }
                           }

}
         }
}
}
}
/// <summary>
/// 获得实例对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public object GetObject(string id)
{
Object result = null;
if(objectContext.ContainsKey(id))
{
result= objectContext[id];
}
return result;
}

}

测试:

ObjectFactory factory = ObjectFactory.Intance(@"F:\单车测试\SringNetJYKuangjia\SpringNet\Objects.xml");
PersonDao persondao = factory.GetObject("personDao") as PersonDao;
Console.WriteLine(persondao.Entity.Name);
Console.WriteLine(persondao.Entity.Age.ToString());
Console.WriteLine(persondao.ToString());

Console.ReadKey();

测试结果:

原文参考自:http://www.cnblogs.com/GoodHelper/archive/2009/11/02/1594398.html

Spring.net-简易的IoC框架

时间: 2024-10-04 17:01:20

Spring.net-简易的IoC框架的相关文章

大话spring.net之IOC框架的简单搭建

讲了这么多理论,我们来手动实现一个简易的IoC框架的,这样可以加深IoC的理论知识. 一.思路 在我们使用Spring.NET框架的时候,首先需要实例化Spring.NET容器, 然后调用IoC容器IObjectFactory接口中GetObject方法获取容器中的对象.通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明一个Dictionary<string, object>来存放IoC容器中的对象,还需要写一个能从Dictionary<string, obj

Spring的IoC框架

容器的含义 Spring中的ApplicationContext继承自BeanFactory, 除了提供了BeanFactory的功能外,还额外提供了依赖管理,消息.生命周期监听等等功能,它就是所谓的"容器" Bean定义 Bean在容器的定义由BeanDefinition定义. 具体的内容包括: 完整的类名 类的依赖关系 类的生命周期回调 类的其它属性 bean的命名 每个Bean可以由一个id, 多个name来命名:必要的时候还可以通过alias来定义别名 对于没有声明名称的bea

从零开始手写 spring ioc 框架,深入学习 spring 源码

IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 但是 spring 源码存在一个问题,那就是过于抽象,导致学习起来成本上升. 所以本项目由渐入深,只实现 spring 的核心功能,便于自己和他人学习 spring 的核心原理. spring 的核心 Spring 的核心就是 spring-beans,后面的一切 spring-boot,spr

在.NET里简易实现IoC

在.NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只是知道依赖倒置是原则,依赖注入.控制反转都是实现的方式,我将在下面对这些个名词做详细的介绍,在篇幅的最后还会自己实现了IoC容器的功能. 依赖倒置原则 我们先来看一段代码,代码1-1 public class Top { public void Execution() { Underly unde

MVC+Spring.NET+NHibernate .NET SSH框架整合

在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我就不多说了,推荐这位大神的<MVC知多少系列>http://www.cnblogs.com/sheng-jie/p/6291915.html.下面进入正题,.NET中也有SSH框架,他们分别指MVC+Spring.NET和NHibernate. 其中Spring.NET是典型的IOC框架,类似的还

spring.net中的IoC、DI和MVC

概述 spring.net是一个开源的业务层的框架,功能非常的强大,归结一下有3个功能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI,和其提供的对MVC框架的支持. IoC和DI IoC,英文全称Inversion of Control,控制反转:DI,英文全称Dependency Injection,依赖注入.简而言之,IoC就是创建对象,DI就是创建对象的时候,进行初始化. IoC和DI就相当于我们通常写的抽象工厂+反射,只不过比抽象工厂的功能强大,但是其

来,咱们自己写一个Android的IOC框架!

到目前位置,afinal开发框架也是用了好几个月了,还记得第一次使用注释完成控件的初始化和事件绑定的时候,当时的心情是多么的兴奋- -代码竟然可以这样写!然后随着不断的学习,也慢慢的对IOC框架和注解反射等东西有了一点简单的了解,之前的一篇文章简单的介绍了一下Java的反射机制,今天的文章,就完成一个简单的,基于IOC的小Demo,让大家慢慢的对IOC有一点简单的了解. 首先,什么是IOC呢? 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来

java轻量级IOC框架Guice

Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用外部可以可以选用Guice的扩展包),完全基于annotation特性,支持重构,代码静态检查. 简单,快速,基本没有学习成本. Guice和spring各有所长,Guice更适合与嵌入式或者高性能但项目简单方案,如OSGI容器,spring更适合大型项目组织. 注入方式 在我们谈到IOC框架,首先我们的话题将是构造,属性以及函数注入

【Struts2】如何实现Struts2与Spring的整合 外加 MyBatis 框架

1,简介 一般没有人会用Spring+Struts2+MyBatis这样的框架了,可不能简称为SSM.因为SSM是Spring+SpringMVC+Mybatis的简称.SSH是Spring+Struts2+Hibernate,不过现在SSH用的人也不多了.这里笔者把Sping+Struts2+Mybatis放在一起就是纯粹的实现一下功能.主要讨论的还是Struts2和Spring. 如果不使用Spring框架,Struts2框架内部还是有机制可以利用反射创建对象,之所以要把Spring+Str