源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#应用XML作为数据库的快速开发框架实现方法

  • 时间:2020-02-17 09:36 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#应用XML作为数据库的快速开发框架实现方法
本文实例讲述了C#应用XML作为数据库的快速开发框架实现方法。分享给大家供大家参考。具体如下: [b]背景[/b] 我经常应用C#开发一些小的桌面程序,这些桌面程序往往有以下几个特点: ① 程序比较小,开发周期很短。 ② 程序的数据量不大,多数情况下不超过1万行记录。 ③ 对程序的性能要求不高。 ④ 程序并发很少或者基本没有。 ⑤ 尽量程序部署简单。 因为C#程序很多情况下都是CURD,结合上面的需求,我一直考虑做一个简单的框架,以达到快速开发的目的。应用XML序列化(XmlSerializer)功能,我开发了一个简单符合上面要求的底层框架。 [b]框架思路[/b] 我准备用XML文件作为数据存储,为了保证数据同步,同时在内存中存储一份数据,每次操作时,都是操作内存中的数据,操作完之后再同步到数据库中。 另外,为了保证框架的易用性,我把底层实现写成了一个泛型类,所有操作类继承此泛型类。 [b]框架功能描述[/b] 框架主要包括以下几个功能: ① 应用XML文件作为数据库,不依赖其他数据库系统。 ② 对外提供基本的CURD功能。 ③ 减少配置,做到0配置。 数据会存储在运行目录下面的data目录下,数据文件可以由开发者指定,也可以采用默认数据文件。 [b]框架应用示例[/b] 如何应用框架进行开发呢?我把框架打成了一个DLL文件,开发项目时,需要引用这个DLL。开发者每定义一个实体类,需要对应定义一个操作类,此操作类需要继承我的泛型操作类。 [b]注意:[/b]实体类需要有一个string类型的ID,我一般用GUID 实体类示例代码:
[u]复制代码[/u] 代码如下:
namespace zDash {     public class CodeEntity     {         public string Id { get; set; }         public string Key { get; set; }         public string Lang { get; set; }         public byte[] RealContent { get; set; }     } }
我把操作类写成了单例模式,操作类示例代码:
[u]复制代码[/u] 代码如下:
namespace zDash {     public class CodeBll : Wisdombud.xmldb.BaseXmlBll<CodeEntity>     {         private static CodeBll inst = new CodeBll();         private CodeBll() { }         public static CodeBll getInst()         {             return inst;         }     } }
如何应用:
[u]复制代码[/u] 代码如下:
CodeBll.getInst().Insert(entity);
XML文件的内容
[u]复制代码[/u] 代码如下:
<?xml version="1.0"?> <ArrayOfCodeEntity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">   <CodeEntity>     <Id>1</Id>     <Key>符号</Key>     <Lang>C#</Lang>     <RealContent>e1</RealContent>   </CodeEntity>   <CodeEntity>     <Id>2</Id>     <Key>符号1</Key>     <Lang>C#</Lang>     <RealContent>e1</RealContent>   </CodeEntity> </ArrayOfCodeEntity>
由上面的例子可以看到,应用此框架进行开发还是非常容易的。 [b]总结[/b] 框架优点: ① 快速开发,完全不需要考虑底层 ② 易于部署 ③ 框架代码比较短小,总共200行左右。 框架缺点: ① 效率低下 ② 未考虑并发,非线程安全 后续还会介绍如何应用这个框架开发一个代码片段管理系统 [b]附:框架源代码 [/b]
[u]复制代码[/u] 代码如下:
using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Xml.Serialization; namespace Wisdombud.xmldb {     public class XmlSerializerBll<T>     {         private static XmlSerializerBll<T> instance;         private string dbFile;         public string Dbfile         {             get { return dbFile; }             set             {                 if (!string.IsNullOrEmpty(value) && !value.Equals(dbFile))                 {                     this.entityList.Clear();                 }                 dbFile = value;                 this.ReadDb();             }         }         private List<T> entityList = new List<T>();         private XmlSerializerBll()         {             this.SetDbFile();             this.ReadDb();         }         private void SetDbFile()         {             string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data");             try             {                 if (Directory.Exists(folder) == false)                 {                     Directory.CreateDirectory(folder);                 }                 Type type = typeof(T);                 if (string.IsNullOrEmpty(this.Dbfile))                 { this.Dbfile = Path.Combine(folder, type.Name + ".xml"); }             }             catch (Exception ex)             {                 Console.WriteLine(ex.Message);             }         }         public static XmlSerializerBll<T> GetInstance()         {             if (instance == null)             {                 instance = new XmlSerializerBll<T>();             }             return instance;         }         public void Insert(T entity)         {             this.entityList.Add(entity);             this.WriteDb();         }         public void InsertRange(IList<T> list)         {             this.entityList.AddRange(list);             this.WriteDb();         }         public System.Collections.Generic.List<T> SelectBy(string name, Object value)         {             System.Collections.Generic.List<T> list = new List<T>();             if (value == null)             {                 return list;             }             Type t = typeof(T);             foreach (var inst in this.entityList)             {                 foreach (PropertyInfo pro in t.GetProperties())                 {                     if (pro.Name.ToLower() == name.ToLower())                     {                         if (value.ToString() == (pro.GetValue(inst, null) ?? string.Empty).ToString())                         {                             list.Add(inst);                         }                     }                 }             }             return list;         }         public T SelectById(string id)         {             Type t = typeof(T);             foreach (var inst in this.entityList)             {                 foreach (PropertyInfo pro in t.GetProperties())                 {                     if (pro.Name.ToLower() == "id")                     {                         if (id == (pro.GetValue(inst, null) ?? string.Empty).ToString())                         {                             return inst;                         }                     }                 }             }             return default(T);         }         public void UpdateById(T entity)         {             Type t = typeof(T);             string id = string.Empty;             foreach (PropertyInfo pro in t.GetProperties())             {                 if (pro.Name.ToLower() == "id")                 {                     id = (pro.GetValue(entity, null) ?? string.Empty).ToString();                     break;                 }             }             this.DeleteById(id);             this.Insert(entity);         }         public void DeleteById(string id)         {             Type t = typeof(T);             T entity = default(T);             foreach (var inst in this.entityList)             {                 foreach (PropertyInfo pro in t.GetProperties())                 {                     if (pro.Name.ToLower() == "id")                     {                         if ((pro.GetValue(inst, null) ?? string.Empty).ToString() == id)                         {                             entity = inst;                             goto FinishLoop;                         }                     }                 }             }         FinishLoop:             this.entityList.Remove(entity);             this.WriteDb();         }         public List<T> SelectAll()         {             this.ReadDb();             return this.entityList;         }         public void DeleteAll()         {             this.entityList.Clear();             this.WriteDb();         }         private void WriteDb()         {             XmlSerializer ks = new XmlSerializer(typeof(List<T>));             FileInfo fi = new FileInfo(this.Dbfile);             var dir = fi.Directory;             if (!dir.Exists)             {                 dir.Create();             }             Stream writer = new FileStream(this.Dbfile, FileMode.Create, FileAccess.ReadWrite);             ks.Serialize(writer, this.entityList);             writer.Close();         }         private void ReadDb()         {             if (File.Exists(this.Dbfile))             {                 XmlSerializer ks = new XmlSerializer(typeof(List<T>));                 Stream reader = new FileStream(this.Dbfile, FileMode.Open, FileAccess.ReadWrite);                 this.entityList = ks.Deserialize(reader) as List<T>;                 reader.Close();             }             else             {                 this.entityList = new List<T>();             }         }     } }
[u]复制代码[/u] 代码如下:
using System.Collections.Generic; namespace Wisdombud.xmldb {     public class BaseXmlBll<T> where T : new()     {         public string DbFile         {             get { return this.bll.Dbfile; }             set { bll.Dbfile = value; }         }         private XmlSerializerBll<T> bll = XmlSerializerBll<T>.GetInstance();         public void Delete(string id)         {             var entity = this.Select(id);             bll.DeleteById(id);         }         public void Insert(T entity)         {             bll.Insert(entity);         }         public void Insert(List<T> list)         {             bll.InsertRange(list);         }         public System.Collections.Generic.List<T> SelectAll()         {             return bll.SelectAll();         }         public void Update(string oldId, T entity)         {             bll.UpdateById(entity);         }         public T Select(string id)         {             return bll.SelectById(id);         }         public System.Collections.Generic.List<T> SelectBy(string name, object value)         {             return bll.SelectBy(name, value);         }         public void DeleteAll()         {             bll.DeleteAll();         }     } }
希望本文所述对大家的C#程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部