建设 DAL。使用 EDM(来自数据库)

2024-02-08

我必须开发一个在 Windows (wpf) 中工作的 lob 应用程序,但应该以两种方式部署:

  • 使用本地数据库(同一台计算机)
  • 具有远程数据库(在同一网络中)

我将使用从数据库生成的实体数据模型(dbcontext、EF 4.0)(VS2012、sql server express 2012)

我想开发一个独特的数据访问层,UI 将绑定到该层,它将直接从 dbcontext(本地数据库)或从公开 dbcontext(远程数据库)数据的 WCF 服务获取数据

我不知道从哪里开始,我需要指导、示例,我知道这取决于应用程序的性质,但一些示例、文章会有很大帮助。我找不到与我的需求类似的示例

我想我最好使用 DI 框架,但我想首先关注 DAL。


好吧,既然您想使用 DI 框架(可能是一个不错的选择:)),您已经知道需要使用接口定义 DAL。然后,您可以使用实现这些接口的类来充当 WCF 服务或 DB 上下文的适配器。

您的设计的一个很好的方面是,您将自动将自己与 WCF 服务和数据库上下文的未来可能的替换隔离开来 - 即,每当 Microsoft 发布另一种数据访问技术时。 :) 或者更有可能的是,每当您的团队决定采用不同的方法时,例如从 WCF 服务切换到 REST 服务。

一般来说存储库模式 http://www.martinfowler.com/eaaCatalog/repository.html就是用来解决这个问题的。例如,您可能有:

public interface IWidgetRepository
{
    // Query methods
    Widget GetById(string id);
    IEnumerable<Widget> GetAll();

    // Update methods
    void RenameWidget(string id, string newName);
    void UpdateWidgetPrice(string id, decimal newPrice);
}

但是,如果您尝试使存储库接口变得非常通用,那么当您开始意识到您想要具有不同的查询功能等时,这很快就会变得令人畏惧(例如,如果您尝试在 DAL 中实现 IQueryable,那么您已经你还有很多工作要做!我已经尝试过,但我放弃了,意识到我只是在浪费精力。)

解决这个问题的最佳方法可能是预定义查询方法,例如GetWidgetsWithOpenOrders() and GetWidgetsWithFooBarComponents。然后在你的适配器类中实现IWidgetRepository您只需通过将这些查询映射到实体框架或 WCF 服务实现来实现这些查询。

这样做的一个副作用是 DAL 将需要自己的一组数据传输对象 (DTO) - 因此您最终会在 DAL 命名空间中得到一个 Widget 类,并且可能在 DB Context 中拥有其他 Widget 类和/或 WCF 服务代理。您可以尝试通过强制数据库上下文使用相同的 Widget 类进行数据库映射来解决此问题,但我不建议这样做。 DB Context 中的 DTO 用于适应数据库,WCF 服务中的 DTO 也是如此 - 它们是服务公开的数据契约。 DAL 中的 DTO 反映了用户界面的需求(在 MVVM 术语中,它们是“模型”;在 OO 模式术语中,它们是Façade http://sourcemaking.com/design_patterns/facade不同的数据访问策略)。

另一个副作用是创建你的存根/模拟实现非常容易IWidgetRepository1) 单元测试和 2) UI 快速原型设计,无需完全实施后端数据访问策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

建设 DAL。使用 EDM(来自数据库) 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 我可以强制 Visual Studio 使用 mingw 编译器吗

    我不喜欢 qt Creator 作为 IDE 喜欢 VS 但我必须完全使用 mingw 编译器 悲剧 只需设置一个 makefile 项目 这样您就可以告诉 VC 运行什么命令来编译您的文件 除了 Visual Studio 项目之外 您还
  • Git filter-branch 给了我两组提交

    我需要从我的提交历史记录中删除一个文件 我跟着Github 删除敏感数据的说明 https help github com articles remove sensitive data git filter branch force ind
  • win32 导出为固定格式

    我试图更改 Excel 文件的页脚 然后使用 Python3 6 中的 win32 包将其转换为 pdf 它实际上适用于我的家用电脑和工作电脑 只有 pdf 导出部分给了我错误 我想知道 MS Office 版本是否重要 因为我家里使用的是
  • d3.js 节点在强制布局中快速拖动时“跳回”

    我正在使用具有零重力和电荷值的力布局 var force d3 layout force gravity 0 charge 0 friction 0 9 linkDistance 250 linkStrength 1 size width
  • MySql查询缓存中的“query_cache_wlock_invalidate”有什么用?

    在添加MySql Query Cache的概念时 我们有一个名为 query cache wlock invalidate 的参数 我想知道这个参数有什么用 Thanks 当您在查询缓存中进行查询时 通常会返回缓存的内容 即使该查询使用另一
  • 无法提交 Hibernate 事务;嵌套异常是 org.hibernate.Transaction 异常:JDBC 提交失败

    我在应用程序中使用 Windows Azure SQL Server 当我连接到应用程序时 它显示以下错误 org springframework transaction TransactionSystemException Could n
  • UIImageView内容模式

    蓝线是图像视图的边界 UIImageView s contentMode is UIViewContentModeScaleAspectFit 我想保持原始图片的比例 怎样才能让图片的左边缘在UIImageView的左边缘 但不喜欢UIVi
  • Android 上的 PhoneGap 不会加载外部脚本

    我正在制作一个简单的应用程序来加载谷歌地图 但问题是每次我加载这个 它无法在我的 Android 模拟器上运行 而在桌面上则可以正常运行 如何让 Phonegap 或 Android 允许外部脚本工作 加载 更新 我总是收到此错误 应用程序
  • 我无法在 Android 真实手机上获取位置

    public class LocationService extends Service private Handler mHandler new Handler private Timer mTimer null private int
  • 有 typeid 可供参考吗?

    我正在寻找一种获取类型名称的方法 类似于typeid但仅供参考 根据这一页 http en cppreference com w cpp language typeid typeid删除引用 如果 type 是引用类型 则结果引用引用的类型
  • 在 C# 中生成运行哈希(或校验和)?

    Preface 我正在执行具有验证提交阶段的数据导入 这个想法是 第一阶段允许从各种来源获取数据 然后在数据库上运行各种插入 更新 验证操作 提交被回滚 但会生成 验证哈希 校验和 提交阶段是相同的 但是 如果 验证哈希 校验和 相同 则将
  • 使用 tfds.load() 无法访问 CelebA 数据集

    我正在尝试在深度学习项目中使用 CelebA 数据集 我有来自 Kaggle 的压缩文件夹 我想解压缩 然后将图像拆分为训练 测试和验证 但后来发现这在我的设备上是不可能的不那么强大 system 因此 为了避免浪费时间 我想使用 Tens
  • 为什么安装opencv后缺少cv2.so?

    今天我将opencv 2 4 4安装到Ubuntu 12 10 但是 import cv2 不起作用 root python Python 2 7 3 default Sep 26 2012 21 53 58 GCC 4 7 2 on li
  • Hello-jni 示例在 Android Studio 2.0 预览版中不起作用

    我正在尝试实施hello jni sample https github com googlesamples android ndk tree master hello jni进入我的项目 我有Gradle2 8 和 com android
  • 切换按钮折叠在 Bootstrap 导航栏中不起作用

    当导航栏折叠时 我的切换按钮不起作用 我已经检查了数据目标几次 看起来没问题 这是我的代码 div class navbar navbar fixed top navbar inverse div class container div d
  • REST API:请求正文为 JSON 或纯 POST 数据?

    我目前正在构建一个 REST API 当前所有 GET 方法都使用 JSON 作为响应格式 POST 和 PUT 操作的最佳实践是什么 在请求正文中使用 JSON 还是纯 POST 我找不到任何关于此事的信息 例如 我看到 Twitter
  • 使用 appcfg.py 时出现意外的关键字参数“context”

    我尝试通过 appcfg py 更新 Google App Engine 上的项目 C gt C Program Files x86 Google google appengine appcfg py update c secondApp
  • 单击时按钮周围出现不需要的轮廓或边框

    我的网站上有一个样式按钮 但是当我单击它时 它会创建一个不需要的边框或轮廓 我不知道是哪个 我怎样才能删除那个边框 以下是与该按钮相关的所有代码 button border hidden cursor pointer outline non
  • UIGraphicsGetImageFromCurrentImageContext() - 内存泄漏

    我正在打开相机UIImagePickerControllerSourceTypeCamera和一个习惯cameraOverlayView这样我就可以拍摄多张照片 而无需 使用照片 步骤 这很好用 但是保存照片功能存在内存泄漏 通过大量的调试
  • 建设 DAL。使用 EDM(来自数据库)

    我必须开发一个在 Windows wpf 中工作的 lob 应用程序 但应该以两种方式部署 使用本地数据库 同一台计算机 具有远程数据库 在同一网络中 我将使用从数据库生成的实体数据模型 dbcontext EF 4 0 VS2012 sq