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

推荐订阅源

T
Troy Hunt's Blog
T
The Blog of Author Tim Ferriss
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
D
DataBreaches.Net
Vercel News
Vercel News
IT之家
IT之家
博客园_首页
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
The Cloudflare Blog
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
小众软件
小众软件
V
V2EX
SecWiki News
SecWiki News
L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog
S
Secure Thoughts
The Last Watchdog
The Last Watchdog
A
About on SuperTechFans
博客园 - 司徒正美
雷峰网
雷峰网
Cloudbric
Cloudbric
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
Google DeepMind News
Google DeepMind News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
PCI Perspectives
PCI Perspectives
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
The Register - Security
The Register - Security
N
Netflix TechBlog - Medium
C
Cyber Attacks, Cyber Crime and Cyber Security
U
Unit 42
The GitHub Blog
The GitHub Blog
P
Privacy International News Feed
博客园 - 三生石上(FineUI控件)
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog

博客园 - 飞得更高

MPI并行编程系列之五:图的单源最短路径算法 MPI并行编程系列之四:KMP算法及并行化 MPI并行编程系列三:并行正则采样排序PSRS MPI并行编程系列 MPI并行编程系列二:快速排序 MPI并行编程系列一:枚举排序 c#基础(一)之内存管理 用Windows Live Writer 首发Blog 一个被我长期忽略的一个问题:验证控件与Button的OnClientClick事件 远程数据自动导入的设计与实现 LINQ TO SQL 复杂查询之Queries with local collections are not supported sql 常用函数总结 面对恶意操作,勇敢说不------定制服务器端验证器 验证控件失效,求助解决方案 js浮点运算bug的解决办法 从页面的生命周期事件到页面基类(PageBase类)的编写 c# 委托实例 回车与服务器控件Button的Click事件 javascript:Web页面中的所有控件清空 - 飞得更高 - 博客园
linq下数据库接口的定义和实现(linq to SQL)
飞得更高 · 2008-11-26 · via 博客园 - 飞得更高

    B/S系统典型的三层架构:业务逻辑层,数据访问层和UI显示层。为了实现业务逻辑层和数据访问层的松耦合,就要在业务逻辑层中定义数据库接口,并在数据访问层实现这些接口。

    linq的出现填平了对象世界和数据世界的鸿沟,把数据当对象,使我们操作数据就像操作对象一样简单。我们定义自己的业务实体类,在类中定义对这些实体数据的操作,将这些操作提交数据库。一切看上去是那么简单,但是,如何将这些实体类和数据库中的数据联系起来呢?我们在什么地方定义这些联系呢?很快,我想到了数据访问层,在数据访问层中定义和实现这些联系,为了实现数据访问层和业务层的松耦合,我又在业务层上定义了数据库接口。

    我在业务层定义了两个接口:数据库接口(IDatabase)和实体数据访问接口(IEntityDataAccess)。

    实体数据访问接口(IEntityDataAccess),继承IQueryable,定义了对实体的操作:

  1. 添加实体
  2. 删除实体
  3. 取得实体对应的数据库

    数据库接口(IDatabase)定义了对数据库的操作:

  1. 取得实体的数据访问
  2. 提交数据库变更
  3. 执行sql语句
  4. 取得业务实体

    下面是示例代码:

    实体数据访问接口(IEntityDataAccess): 

Code

     数据库接口(IDatabase)(假设已经有有个实体:User和UserRole):

Code

    定义完成这些接口以后,我们就要在定义数据访问层,并在数据访问层中实现定义在业务层的接口。

    数据访问层中有两个类:Database和EntityDataAccessAdapter,还有linq的映射文件MappingSource。

    首先,是Database类,继承于IDatabase接口,这个类实现的功能如下:

  1.  根据连接字符串和映射文件取得数据库。
  2. 实现数据库接口
  3. 取得业务实体

    代码如下:

Code

   其次,是EntityDataAccessAdapter,继承于IEntityDataAccess。实现的功能如下: 

  1. 实现各个接口的功能。
  2. 将linq定义的数据访问方法适配到业务层定义的数据访问接口上。

代码如下:

Code

     通过以上操作,定义了数据访问层,并在其中实现了在业务层中定义的接口。实现了数据访问层和业务层的松耦合。

后记:

    这是我在博客园上发表在首页的第一篇文章,水平有限,很属于菜鸟的初级阶段,难免会有错误和不足,欢迎各位高手批评指正^_^。也希望能抛砖引玉,欢迎交流。^_^