当前位置: 首页 > news >正文

EF架构~XMLRepository仓储的实现

对于数据仓储大家应该都很熟悉了,它一般由几个仓储规范和实现它的具体类组成,而仓储的接口与架构本身无关,对于仓储的实现,你可以选择linq2Sql,EF,Nosql,及XML

等等,之前我介绍过linq2Sql,ef和nosql(redis)的仓储实现,今天主要说一下xml仓储的实现。

下面的相关核心代码

XML实体基类

    /// <summary>
    /// XML实体基类
    /// </summary>
    public abstract class XMLEntity
    {

        private string id = Guid.NewGuid().ToString();
        /// <summary>
        /// XML实体主键
        /// </summary>
        public string RootID
        {
            get { return id; }
            set { id = value; }
        }
    }

XML实体的仓储操作

    /// <summary>
    /// XML文件数据仓储
    /// XML结构为Element
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class XMLRepository<TEntity> :
       IRepository<TEntity>
       where TEntity : XMLEntity, new()
    {
        XDocument _doc;
        string _filePath;
        static object lockObj = new object();
        public XMLRepository(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 XElement(member.Name, new XAttribute("value", member.GetValue(item, null))));
            }
            _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.Element("RootID").Attribute("value").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.Element("RootID").Attribute("value").Value == item.RootID
                           select db).Single();
            try
            {
                foreach (var member in item.GetType()
                                           .GetProperties()
                                           .Where(i => i.PropertyType.IsValueType
                                               || i.PropertyType == typeof(String)))//只找简单类型的属性
                {
                    xe.Add(new XElement(member.Name, new XAttribute("value", member.GetValue(item, null))));
                }
                lock (lockObj)
                {
                    _doc.Save(_filePath);
                }
            }

            catch
            {
                throw;
            }

        }

        public IQueryable<TEntity> GetModel()
        {
            IEnumerable<XElement> list = _doc.Root.Elements(typeof(TEntity).Name);
            IList<TEntity> returnList = new List<TEntity>();
            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.Element(member.Name).Attribute("value").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();
        }
    }

感觉面向对象也是一种病,但这种病我认为是正确的,当你对它的理解达到某种程度时,这种病就会犯了,并且你会相信,世间万物,皆为对象

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~XMLRepository仓储的实现,如需转载请自行联系原博主。

相关文章:

  • 上海南站(2007-04-07)
  • ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法
  • 乾颐堂HCIE面试真题系列4,附考场外景,缓解大家的紧张情绪
  • tomcat访问(access)日志配置、记录Post请求参数
  • 求排列求组合的实现
  • zdz工具箱v1.7版本发布了
  • Python中检查MongoDB的返回结果是否为空
  • BitTorrent (协议)
  • perl 使用小结
  • JS获取屏幕,可见窗口和网页文档(html)大小
  • C# 批量复制文件
  • linux 搭建基于域名的虚拟主机
  • 40个新鲜出炉的 Photoshop 优秀教程
  • linux 正则表达式
  • EA使用教程
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【5+】跨webview多页面 触发事件(二)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Brief introduction of how to 'Call, Apply and Bind'
  • es6要点
  • gcc介绍及安装
  • js继承的实现方法
  • Node 版本管理
  • Vue UI框架库开发介绍
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue2.0项目引入element-ui
  • vue-router的history模式发布配置
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 京东美团研发面经
  • 聚簇索引和非聚簇索引
  • 前端技术周刊 2019-01-14:客户端存储
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 学习HTTP相关知识笔记
  • 在Unity中实现一个简单的消息管理器
  • ​ArcGIS Pro 如何批量删除字段
  • ​低代码平台的核心价值与优势
  • ​业务双活的数据切换思路设计(下)
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Note)C++中的继承方式
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (转)h264中avc和flv数据的解析
  • ***利用Ms05002溢出找“肉鸡
  • .aanva
  • .NET Core 中插件式开发实现
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET开源项目介绍及资源推荐:数据持久层
  • @GlobalLock注解作用与原理解析