自己动手写个orm实现(1)

最近公司项目开动了,出于各种考虑还是相对保守的采用 .NET 2.0 + 企业库 + SQLSERVER的大体框架.

为了封装单个实体对象的CRUD操作,遂自己动手写了一个orm实现的工具类库.
-------------------------------------------------------------------------------------------------------
首先,我们声明一个实体接口  IEntity

public   interface  IEntity : ICloneable
{
    
int ID getset; }
    
bool IsPersisted get; }
    IEntity 
get; }
}




根据图示, IEntity接口实现ICloneable接口, 并且有三个属性
ID : 对应每个实体类型所对应的数据库表的主键ID  (有一个前言约定: 所有表的主键id均为自增标识)
IsPersisted : 指示对象是否已持久化(对应到数据库表的一条记录)
Raw : 返回对象实例的已持久化的原始状态

有了实体,如何mapping到具体哪个数据表呢 ?
"约定优于配置", 因此我们直接使用Attribute来实现

public   class  EntityMappingAttribute : Attribute
    
{
        
private string _tableName;        
        
public string TableName
        
{
            
get return _tableName; }
            
set { _tableName = value; }
        }
        

        
public EntityMappingAttribute(string tableName)
        
{
            TableName 
= tableName;
        }


    }


同理,为了建立实体Property到数据表字段的对应关系我们新建PropertyMappingAttribute类

public   class  PropertyMappingAttribute : Attribute
    
{
        
private string _fieldName;

        
public string FieldName
        
{
            
get return _fieldName; }
            
set { _fieldName = value; }
        }


        
public PropertyMappingAttribute() { }

        
public PropertyMappingAttribute(string fieldName)
        
{
            FieldName 
= fieldName;
        }


    }


经过上述处理, 一个十分简单的面向对象实体(Object)到关系型数据表(Relationship)的映射(Mapping)就已经声明完毕了.


既然前面声明了IEntity接口, 理所当然的我们应该实现它

public   abstract   class  EntityBase : IEntity
    
{
        
private IEntity _raw;
        
private int _id;
        
private bool _isPersisted = false;

        
IEntity Members#region IEntity Members
        
/**//// <summary>
        
/// ID
        
/// </summary>

        public virtual int ID
        
{
            
get return _id; }
            
set { _id = value; }
        }



        
public virtual IEntity Raw
        
{
            
get return _raw; }
            
protected set { _raw = value; }
        }



        
/**//// <summary>
        
/// 该对象是否已持久化
        
/// </summary>

        public virtual bool IsPersisted
        
{
            
get return _isPersisted; }
            
protected set { _isPersisted = value; }
        }

        
#endregion



        
ICloneable Members#region ICloneable Members

        
public object Clone()
        
{
            Type type 
= this.GetType();

            
object obj = Activator.CreateInstance(type);

            
foreach (PropertyInfo p in type.GetProperties())
            
{
                
object value = p.GetValue(this,null);
                p.SetValue(obj, value, 
null);
            }


            
return obj;
        }


        
#endregion

    }


由于IEntity 实现了ICloneable接口, 实际上肩负重任的抽象类EntityBase需要实现两个接口.
因为我们不能向外界暴露设置实体是否持久化和原始状态的信息的设置器, 我们把set修饰为protected.
而实现ICloneable比较简单,就是利用反射构造出一个当前实体对象实例的拷贝.


基础工作差不多了, 让我们我们新建一个User

[Serializable]
[EntityMapping(
" t_user " )]
public   class  User : EntityBase
{
    [PropertyMapping]
    
public string Name get;set;}
    
    
public string Hello 
    

自己动手框架是一种非常有挑战性的任务,尤其是对于 ORM(对象关系映射)、MVC(模型-视图-控制器)和IOC(控制反转)这三个框架而言。以下是对这三个框架的简要介绍,以及它们的实现过程。 首先,ORM(对象关系映射)框架是用于将数据库中的表映射为对象的一种技术。在实现ORM框架时,需要定义对象和表之间的映射关系,并提供相应的API来进行数据库的增删改查操作。还需要处理对象之间的关联关系(如一对一、一对多等),并提供事务管理、缓存等功能。 其次,MVC(模型-视图-控制器)框架是一种用于开发Web应用程序的架构模式,将应用程序分为模型、视图和控制器三层。在实现MVC框架时,需要定义模型、视图和控制器的接口,并提供相应的实现。模型负责处理数据逻辑,视图负责展示用户界面,而控制器则负责接收用户请求并进行处理,最后将结果返回给视图进行展示。 最后,IOC(控制反转)框架是一种通过依赖注入来管理对象之间的依赖关系的技术。在实现IOC框架时,需要定义依赖注入的规则,并提供相应的实现。可以使用反射机制来自动实例化对象,并将依赖的对象注入到目标对象中。还需要提供对象的生命周期管理(如单例模式、原型模式等)和对象的配置方式(如XML配置、注解配置等)。 总结来说,自己动手实现ORM、MVC和IOC框架需要掌握相关的技术和知识,并具备良好的设计和编码能力。除了理论知识外,还需要具备实际项目的经验,以便能够更好地设计和实现这些框架。同时,也需要不断学习和改进,跟上技术的发展潮流,以确保框架的高效和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值