惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - 小摘

针对TianvCms的搜索优化文章源码(无版权, 随便用) 针对C#的正规表达式测试程序源码下载(无版权, 随便用) 简易的可视化自定义表单程序源码下载(无版权, 随便用) 主要手段 - 浅谈搜索优化 为什么要优化 - 浅谈搜索优化 TianvCMS后台截图 从“铁道部12306网站被曝出现SQL漏洞”想到 TianvCMS部分官方插件 分享T4代码生成及源码(sqlite版),欢迎新手参考、修改(无版权) 多编辑器支持的实现方式 想要开源了 - 发布在tianvcms发布以前 对IE9浏览器开发者预览版的一些感觉 大家帮忙看看如果面对这个升级文档该怎么处理,或者怎样才能处理得快一些(问在tianvcms改版前) 好久没更新了, 等待着把项目做简单 贴图不说话 从Windows Mac版想到 何去何从 快速开发之我见 - 送给开发效率不断下降的朋友们(二)
小议数据框架的封装
小摘 · 2012-05-30 · via 博客园 - 小摘

忘记数据层是第几次改版了,对数据层重新调整了一下,写点经验, 也写点总结。

内容仅供参考,大鸟飘过

基本思想:

  1. Ado.net是很棒的
  2. 数据库框架是必须的
  3. 单层解决方案总有不适应的时候
  4. 没有完美的解决方案

下面将就以上几条讨论一下:

Ado.net是很棒的:

  ado.net基本上是所有数据框架的基础, 速度快, 性能优, 稳定性好

数据库框架是必须的

  手动写代码绝对是个噩梦, 且不讨论跨数据库的问题, 光维护就要人命(那些数据库永久不变, 逻辑也基本不变的除外)

单层解决方案总有不适应的时候

  数据层的封装多少伴随着功能、性能的缺失,也伴随灵活性的降低

没有完美的解决方案

  对各种数据库的支持是一件体力活,不是专做数据层的人没必要完整实现

就着以上几点,我对数据层进行了如下分层,

第一层:provider - 功能最简单的一层,简易封装System.Data.CommonDbProviderFactory 实现对跨数据库的支持, 基本功能 CreateConnection CreateCommand CreateParameters

效果参考:

using (DbConnection conn = provider.CreateConnection("Data Source=|DataDirectory|cms.s3db;"))
{
  if (conn.State != ConnectionState.Open) conn.Open();

  ...
}

第二层:Db - 对provider的拓展, 主要提供 DbConnection、DbTransaction 快关及访问的支持, 从而实现DbCommand 对 ExecuteNonQuery、ExecuteScalar、ExecuteReader、ExecuteTable 等Execute命令的支持

效果参考:

using (Db db = new Db())
{
  DataTable dt = db.ExecuteTable("select id,title from news_info where id>=@parameter1 and id<=@parameter2", 10, 20);

  ...
}

第三层 Sql -这层主要实现夸数据库sql的支持, 简单的说就是t-sql的生成,这层主要有3部分组成, 

  1. sql - 实现类似jquery语法,
  2. sqldata - 保存sql产生的数据, tablename, columns joins wheres
  3. sqlparser - 把sqldata转换为对应的sql语句

效果参考:

DataTable dt = Sql<news_info>
    .Select()
        .Join<news_category>(t => t.CategoryId, t1 => t1.Id)
    .Columns(t => t.Id, t => t.Title, t => t.Time_Create, t => t.Author)
    .Columns<news_category>(t1 => t1.Title, "CategoryTitle")
    .Where(t => t.Id, ">=", 7)
    .OrderByDesc(t => t.Id)
    .Limit(20)
    .ExecuteTable();

第四层 activerecord - 这是种见了一面就再也放不开的漂亮东西(虽然不怎么面向对象), 这层主要就是把实体类转换成sql或者把sql结构转换为实体类

效果参考:

news_info info2 = news_info.Select(2);

info2.Time_Update = DateTime.Now;
info2.Update();

news_info info = new news_info();
info.Title = "最新消息";
info.Insert();

info.Delete();

通过分层, 并接口公开, 最简单的 activerecord 实现, 复杂一点的Sql 实现, 最复杂的由 Db实现,

关于为什么要有Provider层:Db层肯定是可以通过ado.net直接实现provider的功能的,只是保持provider简单并且只被Db调用, 确实会使程序变得更稳健

题外话:

NHibernate更新了好多版本了, Entity Framework也出了相当多版本了。

不知道是不是依然有人和我一样不愿意去用这两个框架,

不是觉得不够好, 而是有点莫名的不喜欢