博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF架构~XMLRepository仓储的实现~续(XAttribute方式)
阅读量:6079 次
发布时间:2019-06-20

本文共 4170 字,大约阅读时间需要 13 分钟。

之前我写过,主要是针对XElement方式的,对于XML的结构,一般来说有两种,一是使用节点方式的,我习惯称为XElement方式,别一种是属性方式的,我习惯称为XAttribute,这两种方式,我比较取向于后面的,好处就是更简洁,将C#里的类看作节点,而将C#里的属性看作是节点的每个特性(XAttribute),这种方式感觉更容易被人接受!

如果您还看不懂这两方式指的是什么,就看一下两种方式的XML举例吧

XElement方式

1
zzl

XAttribute方式

怎么样,第二种方式更简洁吧,但要注意,XAttribute方式书写时,需要为每个特性的值加双引号的,因为linq to xml认为每个XAttribute都是字符型的,在进行操作时,你可以根据实体类型进行转换的

下面看一下我为XAttribute方式进行封装的Repository吧

XML2Repository.cs源代码

///     /// XML文件数据仓储    /// XML结构为Attribute    ///     /// 
public class XML2Repository
: IRepository
where TEntity : XMLEntity, new() { XDocument _doc; string _filePath; static object lockObj = new object(); public XML2Repository(string filePath) { _filePath = filePath; _doc = XDocument.Load(filePath); } public void Insert(TEntity item) { if (item == null) throw new ArgumentException("The database entity can not be null."); XElement db = new XElement(typeof(TEntity).Name); foreach (var member in item.GetType() .GetProperties() .Where(i => i.PropertyType.IsValueType || i.PropertyType == typeof(String))) { db.Add(new XAttribute(member.Name, member.GetValue(item, null) ?? string.Empty)); } _doc.Root.Add(db); lock (lockObj) { _doc.Save(_filePath); } } public void Delete(TEntity item) { if (item == null) throw new ArgumentException("The database entity can not be null."); XElement xe = (from db in _doc.Root.Elements(typeof(TEntity).Name) where db.Attribute("RootID").Value == item.RootID select db).Single() as XElement; xe.Remove(); lock (lockObj) { _doc.Save(_filePath); } } public void Update(TEntity item) { if (item == null) throw new ArgumentException("The database entity can not be null."); XElement xe = (from db in _doc.Root.Elements(typeof(TEntity).Name) where db.Attribute("RootID").Value == item.RootID select db).Single(); try { foreach (var member in item.GetType() .GetProperties() .Where(i => i.PropertyType.IsValueType || i.PropertyType == typeof(String))) { xe.SetAttributeValue(member.Name, member.GetValue(item, null) ?? string.Empty); } lock (lockObj) { _doc.Save(_filePath); } } catch { throw; } } public IQueryable
GetModel() { IEnumerable
list = _doc.Root.Elements(typeof(TEntity).Name); IList
returnList = new List
(); foreach (var item in list) { TEntity entity = new TEntity(); foreach (var member in entity.GetType() .GetProperties() .Where(i => i.PropertyType.IsValueType || i.PropertyType == typeof(String)))//只找简单类型的属性 { if (item.Attribute(member.Name) != null) member.SetValue(entity, Convert.ChangeType(item.Attribute(member.Name).Value, member.PropertyType), null);//动态转换为指定类型 } returnList.Add(entity); } return returnList.AsQueryable(); } public TEntity Find(params object[] id) { return GetModel().FirstOrDefault(i => i.RootID == Convert.ToString(id[0])); } public void SetDbContext(IUnitOfWork unitOfWork) { throw new NotImplementedException(); } }

 

至此,对于XML的仓储实现就已经完都讲完了,而对于其它仓储我也都在这前介绍过,其中包括EFRepsitory,LinqRepository,MemoryRepositoy,RedisRepository再加上今天的XMLRepository和XML2Repository一共六大仓储了,感觉已经可以写一篇

关于如何实现仓储的文章了,哈哈。

转载地址:http://euxgx.baihongyu.com/

你可能感兴趣的文章
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
Linux系统一些系统查看指令
查看>>
php中的短标签 太坑人了
查看>>